我有这个XML文件:
<root>
<node1>
<name>A</name>
<node2>
<name>B</name>
<node3>
<name>C</name>
<number>001</number>
</node3>
</node2>
</node1>
</root>
我正在解析文件,获取每个节点的名称,以及相应的数字(如果存在)。
我用:
String number = eElement.getElementsByTagName("number").item(0).getTextContent();
这应该给我一些:
Name | Number
A |
B |
C | 001
但我明白了:
Name | Number
A | 001
B | 001
C | 001
所以,我认为getElementsByTagName("Number")
正在寻找节点所有子节点中的数字节点。我不希望这样。有人知道解决方法吗?
我想过使用XPath而不是上面的方法,但我真的想知道是否有现成的方法。感谢
答案 0 :(得分:2)
您可以使用JDK / JRE中的javax.xml.xpath
API来更好地控制通过getElementsByTagName
返回的XML。
import java.io.File;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
public class Demo {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new File("filename.xml"));
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
Element element = (Element) xpath.evaluate("//node3/name", document, XPathConstants.NODE);
}
}
答案 1 :(得分:0)
希望这有帮助,
import java.io.File;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class XML {
public static void main(String[] args) throws IOException {
File input = new File("D:\\sample.xml");
Document doc = Jsoup.parse(input, "UTF-8");
Elements allElements = doc.select("root");
for(Element value : allElements){
System.out.println(value.text());
}
String node3Num = doc.select("node3").tagName("number").text();
System.out.println(node3Num);
}
}
输出: A B C 001 C 001
我使用过jsoup-1.7.2 jar(你可以从jsoup.org下载)
答案 2 :(得分:0)
假设您的eElement
变量始终是有问题的<node1/>
,<node2/>
,...元素之一,那么当您替换上面提到的自己的代码段时,以下代码应该有效:< / p>
String number = null;
NodeList childNodes = eElement.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node node = childNodes.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE
&& node.getNodeName().equals("number")) {
number = node.getTextContent();
break;
}
}
当没有number
孩子时,null
变量将为<number/>
;它将包含您需要的数字。