Tho*_*sen 6 java xml xsd sax xml-namespaces
我有一种情况,我们会定期收到一堆 XML 文件。我们无法控制它们,它们没有命名空间信息,我们真的很想避免更改它们。
我们有一个 XSD,我们需要用它来验证 XML 文件,如果明确编码应用,它就可以工作。现在我们想提示一个 SAX 解析器,这个特定的 XML 方言应该针对这个 XSD(我们在文件系统上有)进行验证,但是除了在 XML 文件中提供 noNamespaceSchemaLocation 之外,我找不到任何其他方法,我们真的会这样做喜欢避免。
建议?EntityResolver 是否总是使用空/空命名空间调用?
(当我被允许时,功能性解决方案将给予 500 奖励积分)
使用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。
| 归档时间: |
|
| 查看次数: |
1418 次 |
| 最近记录: |