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}]}]";

Reply via email to