1

我需要使用更多命名空间来验证 XML 文件,每个命名空间都在外部模式中声明;就像是:

<?xml version="1.0" encoding="UTF-8"?>
<foo:root xmlns:foo="http://foo.com" xmlns:bar="http://bar.com">
    <foo:inside bar:bar="foobar"/>
</foo:root>

但是,我不必针对所有模式验证文件,因为我只需检查其中一个模式的合规性。

我尝试了everyting:SAX、DOM、LSParser,但该文件始终针对所有模式进行验证。即使使用单个模式验证器也无济于事,这让我很困惑(顺便说一下,验证失败,因为 XML 没有指定模式位置)。我还尝试“伪造”我不感兴趣的模式,以便对这些模式的验证可以通过,但我没有设法做出一个好的模式。

我正在寻找一个小例子,它向我展示了如何仅针对一个使用的模式来验证 XML,无论 XML 的其余部分相对于其他模式有多么无效。我不得不说我开始认为这是不可能的,但考虑到这听起来多么奇怪,我仍然可能会遗漏一些东西。

非常感谢

4

3 回答 3

0

您最好的选择实际上是伪造所有“不有趣”的模式。

或者您可以添加自己的 ErrorListener 并仔细分析错误以确定它们相关的架构。但这可能不是完整的证明,因为可能存在停止验证的“其他模式”相关错误。

于 2013-07-08T08:02:26.507 回答
0

这将有助于弄清术语。“架构文档”是一个以 xs:schema 元素为根的 XSD 文件。“模式”是模式组件的任何一致集合,通常是处理不同目标名称空间的多个模式文档的结果,使用 xs:include 和 xs:import 链接。我们可以将这样的模式视为由目标命名空间分区,因此“命名空间的模式”是处理多个模式文档的结果,通常使用 xs:include 链接,它们共享相同的目标命名空间。

您似乎正在针对模式 S 进行验证,并且您希望针对模式 T 进行验证,该模式 T 是 S 中模式组件的子集。

因此,当您说“每个命名空间 [is] 在外部模式中声明”时,我认为您使用的“模式”并不正确。我怀疑您的意思是架构文档。但是我想知道您所说的“声明”是什么意思?你如何告诉模式验证器在哪里可以找到每个命名空间的模式?它是我使用 xsi:schemaLocation 属性的方式,还是通过其他机制?因为无论您使用什么机制,这都是您需要更改的,以便针对不同的模式进行验证。

于 2013-07-08T09:15:56.920 回答
0

扩展XmlFilterImpl(SAX 过滤器)以在模式验证器看到它们之前从其他名称空间(以及这些标签内的所有内容)中删除标签。每个标签的命名空间都传递给startElement(),因此在endElement()调用相应标签之前过滤掉所有内容是很简单的。

class NamespaceFilter extends XMLFilterImpl {
    // filter out content from other namespaces
}

class Main {
    public static void main(String[] args) {
        org.xml.sax.XMLReader reader = XMLReaderFactory.createXMLReader();
        NamespaceFilter filter = new NamespaceFilter();
        filter.setParent(reader);
        javax.xml.validation.Schema schema = /* get a schema */;
        filter.setContentHandler(schema.newValdiatorHandler()); 
        filter.parse(/* xml file */);
    }
}
于 2014-02-27T20:09:34.500 回答