我的情况是我们定期收到一堆XML文件。我们无法控制它们,并且它们没有命名空间信息,我们真的希望避免更改它们。
我们需要使用XSD验证XML文件,如果明确编码应用,则可以使用。现在我们想提示一个SAX解析器应该针对这个XSD(我们在文件系统上)验证这个特定的XML方言,但我找不到任何其他方法,而不是在XML文件中提供noNamespaceSchemaLocation,我们真的会喜欢避免。
连连呢?是否总是使用null / empty命名空间调用EntityResolver?
(当我被允许时,功能性解决方案将提供500点奖励)
答案 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,因此该调用不是必需的。