XML没有命名空间。验证几个XSD之一

时间:2015-09-16 15:03:35

标签: java xml xsd sax xml-namespaces

我的情况是我们定期收到一堆XML文件。我们无法控制它们,并且它们没有命名空间信息,我们真的希望避免更改它们。

我们需要使用XSD验证XML文件,如果明确编码应用,则可以使用。现在我们想提示一个SAX解析器应该针对这个XSD(我们在文件系统上)验证这个特定的XML方言,但我找不到任何其他方法,而不是在XML文件中提供noNamespaceSchemaLocation,我们真的会喜欢避免。

连连呢?是否总是使用null / empty命名空间调用EntityResolver?

(当我被允许时,功能性解决方案将提供500点奖励)

1 个答案:

答案 0 :(得分:3)

使用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关闭为defined by the W3C。由于默认值为false,因此该调用不是必需的。