【问题标题】:getElementsByTagName searching down all levels of XML nodesgetElementsByTagName 向下搜索所有级别的 XML 节点
【发布时间】:2013-11-24 19:15:15
【问题描述】:

我有这个 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 代替上述方法,但我真的很想知道是否有现成的方法。谢谢

【问题讨论】:

  • 你到底想要什么,请用你的完整代码解释...
  • 正如我所提到的,我只是想获取每个节点的名称和编号。如果没有数字,它应该显示为 null。但是,我使用的方法会搜索所有后代。我不想那样。

标签: java xml dom xpath


【解决方案1】:

您可以使用 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);
    }

}

【讨论】:

  • 有没有办法找到说node3(应该是node2)的父节点,然后找到它的名称和编号?
  • @user2611492 - 你的意思是Node.getParentNode()?
  • 我用过getParentNode()。我不确定这是否也可以与 XPath 一起使用。感谢您的建议,它奏效了。不过,我有一个问题,在执行时间方面使用 XPath 是否效率较低?因为我的程序现在需要更长的时间来执行。
【解决方案2】:

希望这会有所帮助,

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下载)

【讨论】:

  • 我的整个项目是使用 'javax.xml.*' 和 'org.w3c.dom.*' 设置的。但是如果没有其他解决方法,我会尝试一下
【解决方案3】:

假设您的 eElement 变量始终是有问题的 &lt;node1/&gt;&lt;node2/&gt;、... 元素之一,那么当您替换上面提到的自己的 sn-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;
  }
}

当没有&lt;number/&gt; 孩子时,number 变量将为null;否则它将包含您需要的数字。

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 2014-02-04
    • 2019-03-04
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多