使用更多模式在Java中验证XML文件,但仅针对其中一个模式

时间:2013-07-08 07:43:06

标签: java xml xsd xml-validation

我需要使用更多命名空间来验证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>

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

我尝试了各种方法:SAX,DOM,LSParser,但该文件始终针对所有模式进行验证。即使使用单一模式验证器也没有帮助,这对我来说非常令人费解(顺便说一句,验证失败,因为XML没有指定模式位置)。我也试过&#34;假的&#34;我不感兴趣的模式,因此这些模式的验证可以通过,但我没有设法做出好的模式。

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

非常感谢

3 个答案:

答案 0 :(得分:0)

你最好的选择是伪造所有“不感兴趣”的模式。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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 */);
    }
}