例如,使用以下两个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解析器库来实现?
答案 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