gpt4 book ai didi

java - 为什么 getElementsByTagNameNS 在 java 中是空的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:06 25 4
gpt4 key购买 nike

我想从 tag2 中获取值,我得到了一个 xml:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<ns1:schema xmlns:ns1='http://example.com'>" +
"<ns1:tag1>" +
" <ns1:tag2>value</ns1:tag2>" +
"</ns1:tag1>" +
"</ns1:schema>";

然后解析成文档,想通过tagnameNS获取元素。但是当我运行它时,节点列表是空的,为什么?

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new InputSource(new StringReader(xml)));

NodeList nl = doc.getElementsByTagNameNS("http://example.com", "tag2");

String a = nl.item(0).getNodeValue();

仍然不适用于 URI。

最佳答案

getElementsByTagNameNS 正在返回结果。问题是您当前正在调用错误的方法来从结果元素中获取文本内容。您需要调用 getTextContext() 而不是 getNodeValue()

String a = nl.item(0).getTextContent();

DomDemo

下面是一个完整的代码示例。

package forum13166195;

import java.io.StringReader;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.InputSource;

public class DomDemo {

public static void main(String[] args) throws Exception{
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<ns1:schema xmlns:ns1='http://example.com'>"
+ "<ns1:tag1>"
+ "<ns1:tag2>value</ns1:tag2>"
+ "</ns1:tag1>"
+ "</ns1:schema>";

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new InputSource(new StringReader(xml)));

NodeList nl = doc.getElementsByTagNameNS("http://example.com", "tag2");

String a = nl.item(0).getTextContent();
System.out.println(a);
}

}

输出

value

替代方法

您还可以使用 javax.xml.xpath API(包含在 Java SE 5 及更高版本中)从 XML 文档中查询值。这些 API 提供了比 getElementsByTagNameNS 更多的控制。

XPath演示

package forum13166195;

import java.io.StringReader;
import java.util.Iterator;
import javax.xml.namespace.NamespaceContext;
import javax.xml.xpath.*;

import org.xml.sax.InputSource;

public class XPathDemo {

public static void main(String[] args) throws Exception{
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<ns1:schema xmlns:ns1='http://example.com'>"
+ "<ns1:tag1>"
+ "<ns1:tag2>value</ns1:tag2>"
+ "</ns1:tag1>"
+ "</ns1:schema>";

XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new NamespaceContext() {

public String getNamespaceURI(String arg0) {
if("a".equals(arg0)) {
return "http://example.com";
}
return null;
}

public String getPrefix(String arg0) {
return null;
}

public Iterator getPrefixes(String arg0) {
return null;
}

});

InputSource inputSource = new InputSource(new StringReader(xml));
String result = (String) xpath.evaluate("/a:schema/a:tag1/a:tag2", inputSource, XPathConstants.STRING);
System.out.println(result);
}

}

输出

value

关于java - 为什么 getElementsByTagNameNS 在 java 中是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com