【问题标题】:How can I select several XML elements using XPath?如何使用 XPath 选择多个 XML 元素?
【发布时间】:2018-02-05 07:11:57
【问题描述】:

假设以下 XML :

<response>
<header>
<resultCode>0000</resultCode>
<resultMsg>OK</resultMsg>
</header>
<body>
<items>
 <item>
  <addr1>America</addr1>
  <addr2>(Atlanta)</addr2>
 </item>
 <item>
  <addr1>Canada</addr1>
  <addr2>(Toronto)</addr2>
 </item>
 <item>
  <addr1>France</addr1>
  <addr2>(Paris)</addr2>
 </item>
 </items>
</body>
</response>

我想使用 XPath 选择几个 XML 元素。 所以,我在下面写了JAVA代码。

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
                .parse(urlBuilder.toString());

XPath xpath = XPathFactory.newInstance().newXPath();

NodeList items = (NodeList) xpath.evaluate("//item", doc, XPathConstants.NODESET );
NodeList addrAll= (NodeList) xpath.evaluate("//item/addr1 | //item/addr2", doc, XPathConstants.NODESET);

System.out.println("length:"+addrAll.getLength());      
for(int tmp=0; tmp<addrAll.getLength();tmp++){
    System.out.println(addrAll.item(tmp).getTextContent());
}

结果是:

    length:6
    America
    (Atlanta)
    Canada
    (Toronto)
    France
    (Paris)

但是,这不是我想要的。 我的预期输出:

length:3    
America (Atlanta)
Canada (Toronto)
France (Paris)

希望你能理解我的问题。 我怎样才能编辑我的代码来做到这一点?

【问题讨论】:

  • 我不明白你的问题!你问错了或解释错了!但据我了解,您希望在使用 println 时将它们放在 1 行中,因此您可以在每一行中将它们全部打印出来。

标签: java xml xpath


【解决方案1】:

xpath 不是这样工作的;它检索它指定的信息,但不会连接多个数据点。

为此,您可以使用 xslt,也可以创建两个 xpath,一个用于每个 addrX 部分,然后让 Java 客户端代码将它们组合起来。

您需要如何更新 Java 代码取决于几件事,例如,每个 item 是否总是同时包含 addr1addr2

如果你可以依赖它,你可以这样做:

System.out.println("length:"+addrAll.getLength());      
for(int tmp=0; tmp<addrAll.getLength();tmp+=2){
    String country = addrAll.item(tmp).getTextContent();
    String city = addrAll.item(tmp+1).getTextContent();
    System.out.printf("%s %s\n", country, city);
}

【讨论】:

    【解决方案2】:

    XPath 1.0 有一组有限的可用数据类型:字符串、布尔值、数字和节点集。您想要的答案是三个字符串的序列,它们与现有节点不对应,并且在 XPath 1.0 中没有三个字符串的序列。

    如果您身处 Java 世界,真的没有理由将自己局限于 XPath 1.0。 XPath 2.0 扩展了类型系统以允许字符串序列,因此您可以使用诸如//item/concat(addr1, ' ', addr2)//item/string-join(*, ' ') 之类的表达式来获得答案。

    XPath 2.0 已经问世十多年了——是时候向前迈进了!您也可以考虑使用比 DOM 更现代的树模型:JDOM2 和 XOM 更容易使用。

    【讨论】:

      【解决方案3】:
      List<WebElement> items = wd.findElements(By.xpath("//items/item"));
      System.out.println("length: " + items.size());
      items.forEach(item -> System.out.println(item.getText()));
      

      输出:

      length: 3 
      America (Atlanta) 
      Canada (Toronto) 
      France (Paris)
      

      您可以放入 List 或 Map。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-10
        • 2015-06-26
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        • 2016-01-14
        • 2011-08-05
        • 1970-01-01
        相关资源
        最近更新 更多