java - xpath 获取子节点相对于 XML 中父节点的位置

标签 java xpath

我需要循环遍历父节点(callEvents)中的所有子节点,并每次保存子节点的位置。(第一次调用事件,第二次调用事件...)。我正在堆栈如何获取父节点java/xpath中每个子节点的位置?

假设我有以下 xml:

<callEvents>
          <gprsCall>...</gprsCall>
          <gprsCall>...</gprsCall>
          <mobileOrigintaedCall>...</mobileOrigintaedCall>
          <gprsCall>...</gprsCall>
          <gprsCall>...</gprsCall>
</callEvents> 

所以代码应该返回:

  • 我的第一个 gprsCall 位置 = 1
  • 我的第二个 gprsCall 位置 = 2
  • 我的第一个 mobileOriginatedCall 位置 = 3
  • 我的第三个 gprsCall 位置 = 4
  • 我的第四个 gprsCall 位置 = 5

最佳答案

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathConstants;
import java.io.StringReader;
import org.xml.sax.InputSource;

class myxml {
    static final String xml = "<callEvents>\n"
        + "<gprsCall>...</gprsCall>\n"
        + "<gprsCall>...</gprsCall>\n"
        + "<mobileOrigintaedCall>...</mobileOrigintaedCall>\n"
        + "<gprsCall>...</gprsCall>\n"
        + "<gprsCall>...</gprsCall>\n"
        + "</callEvents>";

    public static void main (String... args) throws Throwable {
        try {
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(new InputSource(new StringReader(xml)));

            XPathExpression xpath = XPathFactory.newInstance().newXPath().compile("/callEvents/*");
            NodeList nodelist = (NodeList) xpath.evaluate(doc, XPathConstants.NODESET);
            for (int i = 0; i < nodelist.getLength(); i++) {
                System.out.println("Position: " + (i + 1)
                                   + ", name: " + nodelist.item(i).getNodeName());
            }
        } catch (Throwable e) {
            throw e;
        }
    }
}

关于java - xpath 获取子节点相对于 XML 中父节点的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61236066/

相关文章:

c# - 在 C# 中使用带有默认命名空间的 Xpath 进行规范化

java - 以 CamelCase 风格化的单词的正确常量命名约定是什么?

java - 如果类不在 servlet-context 的基础包中,则为 "No message found under code"。为什么?

java - Spring AOP && MVC 的排序方面

html - 与 HtmlAgilityPack 的多个属性匹配的 Xpath 表达式

xml - 如何通过XPath获取XML节点

java - Java在一定时间内创建多个线程

java - 套接字的损坏的 ObjectOutputStream

xpath - 在 Camel 中混合 xpath 和简单表达式

java - Selenium Xpath 在 div 标签内查找表格单元格