Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过XPath中的xmlns标识XML_Java_Xml_Xpath_Xml Namespaces - Fatal编程技术网

Java 通过XPath中的xmlns标识XML

Java 通过XPath中的xmlns标识XML,java,xml,xpath,xml-namespaces,Java,Xml,Xpath,Xml Namespaces,如何使用Java中的XPath区分这两种XML <iq type="result"> <query xmlns="jabber:iq:roster"> </query> </iq> 及 我试过了,它总是打印空的 public class Test { public static void main(String[] args) throws Exception { final String xml

如何使用Java中的XPath区分这两种XML

<iq type="result">
    <query xmlns="jabber:iq:roster">
    </query>
</iq>


我试过了,它总是打印空的

public class Test {

    public static void main(String[] args) throws Exception {
        final String xml = "<iq type=\"result\"><query xmlns=\"jabber:iq:roster\"></query></iq>";

        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document document = builder.parse(createInputSource(xml));

        XPath xpath = XPathFactory.newInstance().newXPath();
        xpath.setNamespaceContext(new NamespaceContext() {
            @Override
            public String getNamespaceURI(String prefix) {
                switch (prefix) {
                    case "roster":
                        return "jabber:iq:roster";
                    case "vcard":
                        return "vcard-temp";
                }

                return XMLConstants.NULL_NS_URI;
            }

            @Override
            public String getPrefix(String namespaceURI) {
                throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public Iterator getPrefixes(String namespaceURI) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
        });

        Node match = (Node) xpath.evaluate("/iq/roster:query", document, XPathConstants.NODE);
        System.out.println(match);
    }

    private static InputSource createInputSource(String xml) {
        return new InputSource(new StringReader(xml));
    }
}
公共类测试{
公共静态void main(字符串[]args)引发异常{
最后一个字符串xml=”“;
DocumentBuilder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
documentdocument=builder.parse(createInputSource(xml));
XPath=XPathFactory.newInstance().newXPath();
setNamespaceContext(新的NamespaceContext(){
@凌驾
公共字符串getNamespaceURI(字符串前缀){
开关(前缀){
案例“名册”:
返回“jabber:iq:花名册”;
案例“vcard”:
返回“vcard temp”;
}
返回XMLConstants.NULL\u NS\u URI;
}
@凌驾
公共字符串getPrefix(字符串名称空间URI){
抛出新的UnsupportedOperationException(“尚未支持”);
}
@凌驾
公共迭代器getPrefixes(字符串名称空间URI){
抛出新的UnsupportedOperationException(“尚未支持”);
}
});
Node match=(Node)xpath.evaluate(“/iq/花名册:查询”,文档,XPathConstants.Node);
系统输出打印项次(匹配);
}
私有静态InputSource createInputSource(字符串xml){
返回新的InputSource(新的StringReader(xml));
}
}

使用XPath查询XML文档时使用的任何API都很可能有一种方法可以为名称空间注册名称空间前缀,例如使用 因此,您可以为每个名称空间分配不同的前缀,并使用如下内容检索相应的节点:

/iq/jRoster:query
/iq/vcard:query
另一个选项是跳过NamespaceContext并使用namespace-uri()

在创建文档生成器时,似乎还需要在上使用setNamespaceAware(true):

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();

我缺少setNamespaceAware()。现在工作。
/iq/*[local-name() = "query" and namespace-uri() = "jabber:iq:roster"]
/iq/*[local-name() = "query" and namespace-uri() = "vcard-temp"]
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();