<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>question Re: Groovy script to validate XML against schema (XSD) always returns a valid XML even when it is invalid in Support Questions</title>
    <link>https://community.cloudera.com/t5/Support-Questions/Groovy-script-to-validate-XML-against-schema-XSD-always/m-p/409431#M252842</link>
    <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://community.cloudera.com/t5/user/viewprofilepage/user-id/35454"&gt;@MattWho&lt;/a&gt;&amp;nbsp;&lt;a href="https://community.cloudera.com/t5/user/viewprofilepage/user-id/33232"&gt;@ArtiW&lt;/a&gt;&amp;nbsp;&lt;a href="https://community.cloudera.com/t5/user/viewprofilepage/user-id/81274"&gt;@gtorres&lt;/a&gt;&amp;nbsp;Do you have any insights here? Thanks!&lt;/P&gt;</description>
    <pubDate>Fri, 06 Jun 2025 18:01:37 GMT</pubDate>
    <dc:creator>DianaTorres</dc:creator>
    <dc:date>2025-06-06T18:01:37Z</dc:date>
    <item>
      <title>Groovy script to validate XML against schema (XSD) always returns a valid XML even when it is invalid</title>
      <link>https://community.cloudera.com/t5/Support-Questions/Groovy-script-to-validate-XML-against-schema-XSD-always/m-p/409414#M252840</link>
      <description>&lt;P&gt;Since the later versions of NiFi no longer provide the detailed reason an XML FlowFile fails validation against a schema (just a generic Validation Failed), I have been trying to create my own using the ExecuteGroovyScript processor. I am new to NiFI and Groovy, but I am an experienced .Net developer in C#.&lt;/P&gt;&lt;P&gt;Below is my Groovy script in the procesor:&lt;/P&gt;&lt;P&gt;import groovy.xml.XmlUtil&lt;BR /&gt;import javax.xml.transform.stream.StreamSource&lt;BR /&gt;import javax.xml.validation.SchemaFactory&lt;BR /&gt;import javax.xml.XMLConstants&lt;/P&gt;&lt;P&gt;def flowFile = session.get()&lt;BR /&gt;if (!flowFile) return&lt;/P&gt;&lt;P&gt;def xmlContent = flowFile.read().getText("UTF-8")&lt;/P&gt;&lt;P&gt;def schemaFile = new File("My_XML_Schema.xsd")&lt;BR /&gt;&lt;BR /&gt;def schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)&lt;BR /&gt;def schema = schemaFactory.newSchema(schemaFile)&lt;BR /&gt;def validator = schema.newValidator()&lt;BR /&gt;&lt;BR /&gt;def validationErrors = new StringBuilder()&lt;BR /&gt;validator.setErrorHandler(new org.xml.sax.helpers.DefaultHandler() {&lt;BR /&gt;@Override&lt;BR /&gt;void warning(org.xml.sax.SAXParseException e) throws org.xml.sax.SAXException {&lt;BR /&gt;validationErrors.append("Warning: ${e.message}\n")&lt;BR /&gt;}&lt;BR /&gt;@Override&lt;BR /&gt;void error(org.xml.sax.SAXParseException e) throws org.xml.sax.SAXException {&lt;BR /&gt;validationErrors.append("Error: ${e.message}\n")&lt;BR /&gt;}&lt;BR /&gt;@Override&lt;BR /&gt;void fatalError(org.xml.sax.SAXParseException e) throws org.xml.sax.SAXException {&lt;BR /&gt;validationErrors.append("Fatal Error: ${e.message}\n")&lt;BR /&gt;}&lt;BR /&gt;})&lt;/P&gt;&lt;P&gt;try {&lt;BR /&gt;validator.validate(new StreamSource(new StringReader(xmlContent)))&lt;BR /&gt;session.transfer(flowFile, REL_SUCCESS)&lt;BR /&gt;} catch (org.xml.sax.SAXParseException e) {&lt;BR /&gt;validationErrors.append("Validation failed: ${e.message}\n")&lt;BR /&gt;flowFile = session.putAttribute(flowFile, "xml.validation.errors", validationErrors.toString())&lt;BR /&gt;session.transfer(flowFile, REL_FAILURE)&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;When I test it, it will always rout to Success. Even if I put elements or attributes in the XML file that are not in the schema, it always produces a Valid response. If I test the XML and XSD with the ValidateXML processor it does properly mark as Valid or Invalid.&lt;/P&gt;&lt;P&gt;I have also tried parsing the FlowFile into&amp;nbsp;XmlSlurper and then using&amp;nbsp;XmlUtil.serialize in the new StringReader and get the same results. Always valid even if it is not.&lt;/P&gt;&lt;P&gt;Has anyone successfully been able to validate XML to schema with a Groovy script and record the details validation errors?&lt;/P&gt;</description>
      <pubDate>Tue, 21 Apr 2026 06:19:05 GMT</pubDate>
      <guid>https://community.cloudera.com/t5/Support-Questions/Groovy-script-to-validate-XML-against-schema-XSD-always/m-p/409414#M252840</guid>
      <dc:creator>BobKing</dc:creator>
      <dc:date>2026-04-21T06:19:05Z</dc:date>
    </item>
    <item>
      <title>Re: Groovy script to validate XML against schema (XSD) always returns a valid XML even when it is invalid</title>
      <link>https://community.cloudera.com/t5/Support-Questions/Groovy-script-to-validate-XML-against-schema-XSD-always/m-p/409431#M252842</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://community.cloudera.com/t5/user/viewprofilepage/user-id/35454"&gt;@MattWho&lt;/a&gt;&amp;nbsp;&lt;a href="https://community.cloudera.com/t5/user/viewprofilepage/user-id/33232"&gt;@ArtiW&lt;/a&gt;&amp;nbsp;&lt;a href="https://community.cloudera.com/t5/user/viewprofilepage/user-id/81274"&gt;@gtorres&lt;/a&gt;&amp;nbsp;Do you have any insights here? Thanks!&lt;/P&gt;</description>
      <pubDate>Fri, 06 Jun 2025 18:01:37 GMT</pubDate>
      <guid>https://community.cloudera.com/t5/Support-Questions/Groovy-script-to-validate-XML-against-schema-XSD-always/m-p/409431#M252842</guid>
      <dc:creator>DianaTorres</dc:creator>
      <dc:date>2025-06-06T18:01:37Z</dc:date>
    </item>
    <item>
      <title>Re: Groovy script to validate XML against schema (XSD) always returns a valid XML even when it is invalid</title>
      <link>https://community.cloudera.com/t5/Support-Questions/Groovy-script-to-validate-XML-against-schema-XSD-always/m-p/412734#M253657</link>
      <description>&lt;P&gt;I found the solution. While the code did validate the XML to the schema, I needed to add a conditional statement to transfer to failure:&lt;/P&gt;&lt;DIV&gt;import groovy.xml.XmlSlurper&lt;/DIV&gt;&lt;DIV&gt;import groovy.xml.XmlUtil&lt;/DIV&gt;&lt;DIV&gt;import javax.xml.transform.stream.StreamSource&lt;/DIV&gt;&lt;DIV&gt;import javax.xml.validation.SchemaFactory&lt;/DIV&gt;&lt;DIV&gt;import javax.xml.XMLConstants&lt;/DIV&gt;&lt;DIV&gt;import org.xml.sax.ErrorHandler&lt;/DIV&gt;&lt;DIV&gt;import org.xml.sax.SAXParseException&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;def flowFile = session.get()&lt;/DIV&gt;&lt;DIV&gt;if (!flowFile) return&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;def fileXML = flowFile.read().getText("UTF-8")&lt;/DIV&gt;&lt;DIV&gt;def xmlContent = new XmlSlurper().parseText(fileXML.trim().replaceFirst("^([\\W]+)&amp;lt;","&amp;lt;").replaceAll('\'','\'\''))&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;def schemaFile = flowFile.getAttribute('XMLSchema')&lt;/DIV&gt;&lt;DIV&gt;def schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)&lt;/DIV&gt;&lt;DIV&gt;def schema = schemaFactory.newSchema(new File(schemaFile))&lt;/DIV&gt;&lt;DIV&gt;def validator = schema.newValidator()&lt;/DIV&gt;&lt;DIV&gt;def validationErrors = new StringBuilder()&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;validator.setErrorHandler(new ErrorHandler() {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; void warning(org.xml.sax.SAXParseException e) throws org.xml.sax.SAXException {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; validationErrors.append("&amp;lt;p&amp;gt;Warning: ${e.message}&amp;lt;/p&amp;gt;")&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; void error(org.xml.sax.SAXParseException e) throws org.xml.sax.SAXException {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; validationErrors.append("&amp;lt;p&amp;gt;Error: ${e.message}&amp;lt;/p&amp;gt;")&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; void fatalError(org.xml.sax.SAXParseException e) throws org.xml.sax.SAXException {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; validationErrors.append("&amp;lt;p&amp;gt;Fatal Error: ${e.message}&amp;lt;/p&amp;gt;")&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;})&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;try {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; validator.validate(new StreamSource(new StringReader(XmlUtil.serialize(xmlContent))))&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &lt;STRONG&gt;if (validationErrors.length() &amp;gt; 0) {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; flowFile = session.putAttribute(flowFile, "xml.validation.errors", validationErrors.toString())&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; session.transfer(flowFile, REL_FAILURE)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; } else {&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; session.transfer(flowFile, REL_SUCCESS)&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; }&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;} catch (org.xml.sax.SAXParseException e) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; validationErrors.append("Validation failed: ${e.message}\n")&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; flowFile = session.putAttribute(flowFile, "xml.validation.errors", validationErrors.toString())&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; session.transfer(flowFile, REL_FAILURE)&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;</description>
      <pubDate>Fri, 24 Oct 2025 11:45:02 GMT</pubDate>
      <guid>https://community.cloudera.com/t5/Support-Questions/Groovy-script-to-validate-XML-against-schema-XSD-always/m-p/412734#M253657</guid>
      <dc:creator>BobKing</dc:creator>
      <dc:date>2025-10-24T11:45:02Z</dc:date>
    </item>
  </channel>
</rss>

