This is an automated email from the ASF dual-hosted git repository.
pvillard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 625236b7f3 NIFI-14780 Removed introduction of default field name for
content when content is not set to be included and schema is inferred in
XMLReader.
625236b7f3 is described below
commit 625236b7f307c9d51a70b53166e6983e3aff45e0
Author: dan-s1 <[email protected]>
AuthorDate: Mon Feb 23 20:31:35 2026 +0000
NIFI-14780 Removed introduction of default field name for content when
content is not set to be included and schema is inferred in XMLReader.
This closes #10929.
Signed-off-by: Pierre Villard <[email protected]>
---
.../processors/standard/TestConvertRecord.java | 37 ++++++++++++++++++++++
.../main/java/org/apache/nifi/xml/XMLReader.java | 1 -
.../apache/nifi/xml/inference/XmlRecordSource.java | 2 +-
.../java/org/apache/nifi/xml/TestXMLReader.java | 33 +++++++++++++++++++
4 files changed, 71 insertions(+), 2 deletions(-)
diff --git
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestConvertRecord.java
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestConvertRecord.java
index 00b75361ae..7ed69c89c7 100644
---
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestConvertRecord.java
+++
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestConvertRecord.java
@@ -628,4 +628,41 @@ public class TestConvertRecord {
final List<String> actualAttributeValuesFromSecondff =
JsonPath.read(secondFlowFile.getContent(), jsonPath);
assertEquals(expectedAttributeValues,
actualAttributeValuesFromSecondff);
}
+
+ @Test
+ public void
testXMLReaderhasNoDefaultFieldNameWhenContentNameFieldNameNotSet() throws
InitializationException {
+ final XMLReader xmlReader = new XMLReader();
+ runner.addControllerService(READER_ID, xmlReader);
+ runner.setProperty(xmlReader,
SchemaAccessUtils.SCHEMA_ACCESS_STRATEGY, SchemaInferenceUtil.INFER_SCHEMA);
+ runner.setProperty(xmlReader, XMLReader.RECORD_FORMAT,
XMLReader.RECORD_SINGLE.getValue());
+ runner.setProperty(xmlReader, XMLReader.PARSE_XML_ATTRIBUTES, "true");
+ runner.enableControllerService(xmlReader);
+
+ final JsonRecordSetWriter jsonWriter = new JsonRecordSetWriter();
+ runner.addControllerService(WRITER_ID, jsonWriter);
+ runner.setProperty(jsonWriter,
SchemaAccessUtils.SCHEMA_ACCESS_STRATEGY,
SchemaAccessUtils.INHERIT_RECORD_SCHEMA);
+ runner.setProperty(jsonWriter, JsonRecordSetWriter.PRETTY_PRINT_JSON,
"true");
+ runner.enableControllerService(jsonWriter);
+
+ runner.setProperty(ConvertRecord.RECORD_READER, READER_ID);
+ runner.setProperty(ConvertRecord.RECORD_WRITER, WRITER_ID);
+ final String xml = """
+ <note>
+ <to alias="TK">Kyle</to>
+ <from>Stan</from>
+ <heading>Reminder</heading>
+ <body>Don't forget me this weekend!</body>
+ </note>
+ """;
+ runner.enqueue(xml);
+
+ runner.run();
+
+ runner.assertAllFlowFilesTransferred(ConvertRecord.REL_SUCCESS, 1);
+ final MockFlowFile firstFlowFile =
runner.getFlowFilesForRelationship(ConvertRecord.REL_SUCCESS).getFirst();
+ final String jsonPath = "$[0].to";
+ final Map<String, String> toObject =
JsonPath.read(firstFlowFile.getContent(), jsonPath);
+
+ assertFalse(toObject.containsKey("value"));
+ }
}
diff --git
a/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/XMLReader.java
b/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/XMLReader.java
index 91f94b2353..06cca3151c 100644
---
a/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/XMLReader.java
+++
b/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/XMLReader.java
@@ -168,7 +168,6 @@ public class XMLReader extends SchemaRegistryService
implements RecordReaderFact
final RecordSourceFactory<XmlNode> sourceFactory = (variables,
contentStream) -> {
String contentFieldName =
trim(context.getProperty(CONTENT_FIELD_NAME).evaluateAttributeExpressions(variables).getValue());
- contentFieldName = (contentFieldName == null) ? "value" :
contentFieldName;
final String attributePrefix =
trim(context.getProperty(ATTRIBUTE_PREFIX).evaluateAttributeExpressions(variables).getValue());
return new XmlRecordSource(contentStream, contentFieldName,
isMultipleRecords(context, variables), parseXmlAttributes, attributePrefix);
};
diff --git
a/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/inference/XmlRecordSource.java
b/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/inference/XmlRecordSource.java
index f19265385c..320f108db8 100644
---
a/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/inference/XmlRecordSource.java
+++
b/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/inference/XmlRecordSource.java
@@ -129,7 +129,7 @@ public class XmlRecordSource implements
RecordSource<XmlNode> {
return new XmlTextNode(nodeName, content.toString().trim());
} else {
final String textContent = content.toString().trim();
- if (!textContent.equals("")) {
+ if (!textContent.isEmpty() && contentFieldName != null) {
childNodes.put(contentFieldName, new
XmlTextNode(contentFieldName, textContent));
}
diff --git
a/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestXMLReader.java
b/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestXMLReader.java
index 33fb34bea4..ec71c2bdbe 100644
---
a/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestXMLReader.java
+++
b/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestXMLReader.java
@@ -18,8 +18,13 @@
package org.apache.nifi.xml;
import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.logging.ComponentLog;
import org.apache.nifi.schema.access.SchemaAccessUtils;
import org.apache.nifi.schema.inference.SchemaInferenceUtil;
+import org.apache.nifi.serialization.RecordReader;
+import org.apache.nifi.serialization.record.Record;
+import org.apache.nifi.serialization.record.RecordSchema;
+import org.apache.nifi.util.MockConfigurationContext;
import org.apache.nifi.util.MockFlowFile;
import org.apache.nifi.util.MockPropertyConfiguration;
import org.apache.nifi.util.PropertyMigrationResult;
@@ -28,7 +33,12 @@ import org.apache.nifi.util.TestRunners;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -48,7 +58,9 @@ import static
org.apache.nifi.schema.access.SchemaAccessUtils.SCHEMA_VERSION;
import static
org.apache.nifi.schema.inference.SchemaInferenceUtil.OBSOLETE_SCHEMA_CACHE;
import static
org.apache.nifi.schema.inference.SchemaInferenceUtil.SCHEMA_CACHE;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+@ExtendWith(MockitoExtension.class)
class TestXMLReader {
private static final String CONTENT_NAME = "content_field";
@@ -235,6 +247,27 @@ class TestXMLReader {
assertEquals(expectedContent, actualContent);
}
+ @Test
+ void testNoDefaultFieldWhenInferSchemaAndContentFieldNameNotSet(@Mock
ComponentLog log) throws Exception {
+ final Map<PropertyDescriptor, String> xmlReaderProperties = new
HashMap<>();
+ xmlReaderProperties.put(SchemaAccessUtils.SCHEMA_ACCESS_STRATEGY,
SchemaInferenceUtil.INFER_SCHEMA.getValue());
+ xmlReaderProperties.put(XMLReader.RECORD_FORMAT,
XMLReader.RECORD_SINGLE.getValue());
+ xmlReaderProperties.put(XMLReader.PARSE_XML_ATTRIBUTES, "true");
+ final MockConfigurationContext configurationContext = new
MockConfigurationContext(reader, xmlReaderProperties, null, Map.of());
+ reader.onEnabled(configurationContext);
+ reader.storeSchemaAccessStrategy(configurationContext);
+
+ final String content = Files.readString(personRecord);
+ final byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
+ final ByteArrayInputStream inputStream = new
ByteArrayInputStream(bytes);
+ final RecordReader recordReader = reader.createRecordReader(null,
inputStream, bytes.length, log);
+ final Record nextRecord = recordReader.nextRecord();
+ final Record subRecord = nextRecord.getAsRecord("software",
nextRecord.getSchema());
+ final RecordSchema subRecordSchema = subRecord.getSchema();
+
+ assertFalse(subRecordSchema.getFieldNames().contains("value"));
+ }
+
@Test
void testInferSchemaContentFieldNameSetSubElementExistsNameClash() throws
Exception {
final String expectedContent =
"MapRecord[{field_with_attribute=MapRecord[{attr=attr_content, value=content of
field}]}]";