【问题标题】:Getting Schema info from XML while validating in Java在 Java 中进行验证时从 XML 获取架构信息
【发布时间】:2010-12-09 01:42:15
【问题描述】:

我需要根据 XML 架构验证 XML 文件,以便从 XML 中获取架构信息。

我有定义其名称空间的 XML 文档。像这样:

<?xml version="1.0" encoding="UTF-8"?>
<myelement xmlns="mynamespace">

</myelement>

架构位置不在文档中,所以我需要告诉验证器给定命名空间的架构在哪里。现在我这样做了:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
DocumentBuilder parser = dbf.newDocumentBuilder();
Document document = parser.parse(new File("mydocument.xml"));
String namespace = document.getChildNodes().item(0).getNamespaceURI();
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.setErrorHandler(new MyErrorHandler());
validator.validate(new DOMSource(document));

这种方式可行,但有两个问题:

1) 我必须先手动解析文档并创建模式有点笨拙,尽管理论上验证器拥有自动执行所需的所有信息。

2) 如果我验证 Document 对象,我不会得到正确的错误行号。为了获得正确的行号,我必须解析同一个文档两次(第一次获取命名空间,第二次验证)。

有人知道更好的解决方案吗?

有没有办法在解析前告诉解析器 namespace1 对应 schema1.xsd,namespace2 对应 schema2.xsd 等等?或者我可以编写某种回调,解析器可以使用它来询问架构(例如,我可以将 LSResourceResolver 提供给 SchemaFactory)?

【问题讨论】:

    标签: java xml validation schema xml-validation


    【解决方案1】:

    目前,您的解析器无法根据您的架构验证您的文档,因为架构不可用(并且解析器甚至没有配置为验证您的文档)。要自动实现这一点,我认为有两种选择:

    1. 编辑您的 XML 以包含 xsi:schemaLocation 属性(虽然不确定这是否受支持)

    2. 为您的命名空间注册架构:

    代码:

    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
    Schema schema = factory.newSchema(schemaFile);
    
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware( true );
    dbf.setValidating(true);
    dbf.setSchema(schema);
    

    【讨论】:

    • 1.如果 schemaLocation 属性存在,则可以使其工作,但在我的情况下它不存在,我不能强制使用此属性。当只给出命名空间时,我必须能够验证文档。 2. 这样可以,但这是我的问题。在查看 XML 文档之前,我不知道要使用哪个模式。我正在寻找的是一种在解析之前告诉解析器 namespace1 对应于 schema1.xsd、namespace2 对应于 schema2.xsd 等的方法,或者是一个选项来编写解析器可以用来询问架构的某种回调。
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2013-11-20
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多