从每个命名空间+标签名称的XML文件中获取元素

时间:2019-12-02 16:04:53

标签: java xml

例如,使用以下两个XML字符串:

1。

 <D:current-user-principal xmlns:D="DAV:">
        <D:href>/principals/users/cdaboo</D:href>
      </D:current-user-principal>

2。

<d:current-user-principal xmlns:d="DAV:">
        <d:href>/principals/users/cdaboo</d:href>
      </d:current-user-principal>

它们基本相同,但xmlns:D="DAV:" xmlns:d="DAV:"有所不同。

当我通过Java XML DOM API找到current-user-principal元素时,我不能简单地使用getElementsByTagName方法。 该程序失败:

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;
        builder = factory.newDocumentBuilder();
        Document doc = null;

        doc = builder.parse(new InputSource(new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><D:current-user-principal xmlns:D=\"DAV:\">\n" +
                "<D:href>/test/for/stackoverflow</D:href>\n" +
                "</D:current-user-principal>")));
        doc.getDocumentElement().normalize();

        NodeList currentUserPrincipal = doc.getElementsByTagName("d:current-user-principal");
        System.out.println(currentUserPrincipal.item(0).getTextContent());

因为我搜索“ d:current-user-principal”而不是“ D:current-user-principal”。

是否有一种简单的方法可以通过Java DOM API或任何其他xml解析器库来实现?

1 个答案:

答案 0 :(得分:3)

您可以使用getElementsByTagNameNS之类的 NS 方法来查找元素。

您只是不使用前缀,而是使用名称空间本身。

您需要创建一个了解名称空间的工厂。


        String docstr = " <D:current-user-principal xmlns:D=\"DAV:\">\r\n" + 
                "        <D:href>/principals/users/cdaboo</D:href>\r\n" + 
                "      </D:current-user-principal>";
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        ByteArrayInputStream docBytes = new ByteArrayInputStream(docstr.getBytes("utf-8"));
        Document doc = builder.parse(docBytes);

        Element root = doc.getDocumentElement();
        String uri = root.getNamespaceURI();
        NodeList elementsByTagNameNS = doc.getElementsByTagNameNS(uri , "href");

        Element node = (Element) elementsByTagNameNS.item(0);
        System.out.println(node.getTextContent()); // Prints: /principals/users/cdaboo
相关问题