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

XML without namespace. Validate against one of several XSD's

我经常收到一堆 XML 文件。我们无法控制它们,它们也没有命名空间信息,我们真的很想避免更改它们。

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

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

(一个功能性的解决方案会在我允许的情况下提供500个奖励积分)

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

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

注意setValidating()只表示关闭DTD validation as defined by the W3C。该调用严格来说不是必需的,因为默认值为 false。