没有命名空间的 XML。针对多个 XSD 之一进行验证

Tho*_*sen 6 java xml xsd sax xml-namespaces

我有一种情况,我们会定期收到一堆 XML 文件。我们无法控制它们,它们没有命名空间信息,我们真的很想避免更改它们。

我们有一个 XSD,我们需要用它来验证 XML 文件,如果明确编码应用,它就可以工作。现在我们想提示一个 SAX 解析器,这个特定的 XML 方言应该针对这个 XSD(我们在文件系统上有)进行验证,但是除了在 XML 文件中提供 noNamespaceSchemaLocation 之外,我找不到任何其他方法,我们真的会这样做喜欢避免。

建议?EntityResolver 是否总是使用空/空命名空间调用?

(当我被允许时,功能性解决方案将给予 500 奖励积分)

wer*_*ero 4

使用java.xml.validation您可以指定用于验证 XML 文档的 XSD 架构,而无需被文档引用:

import javax.xml.XMLConstants;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

...
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new File("<path to the xsd>"));

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(false);
spf.setSchema(schema);

XMLReader xmlReader = spf.newSAXParser().getXMLReader();
xmlReader.setContentHandler(...);
xmlReader.parse(new InputSource(...)); // will validate against the schema
Run Code Online (Sandbox Code Playgroud)

请注意,这setValidating()仅意味着关闭W3C 定义的DTD验证。该调用并不是绝对必要的,因为默认值是 false。