java从xpath获取元素

时间:2011-05-17 07:57:22

标签: java xpath xom

您好我想从xpath查询中获取数据

Element location = (Element) doc.query("//location[location_name='"+ locationName +"']/*").get(0).getDocument().getRootElement();
System.out.println(location.toXML());

Element loc = location.getFirstChildElement("location");
System.out.println(loc.getFirstChildElement("location_name").getValue());

但无论我选择什么,我总是得到1个节点(因为.get(0)),但我不知道如何选择查询选择的节点。

我发现我应该将节点转换为Element(XOM getting attribute from Node?),但这里展示了如何选择第一个节点。

3 个答案:

答案 0 :(得分:4)

在结果中的第一个元素上调用getParent()

Builder parse = new Builder();
Document xml = parse.build("/var/www/JAVA/toForum.xml");

System.out.println(xml.query("//location[@id=83]/*").get(0).getParent().toXML());

产生以下输出:

<location id="83">
  <location_name>name</location_name>
  <company_name>company a</company_name>
  <machines>
    <machine id="12">A</machine>
    <machine id="312">B</machine>
  </machines>
</location>

答案 1 :(得分:2)

您对getDocument()的调用将返回整个XML文档。

query()的调用会返回一个Nodes对象,该对象直接包含对您所追求的节点的引用。

如果您更改为

Element location = (Element)doc.query(
            "//location[location_name='"+ locationName +"']/*").get(0);

System.out.println(location.getAttribute("location_name").getValue());

应该没问题

编辑(通过extraneon)

一些不值得回答的额外解释: 通过做

Element location = 
  (Element) doc.query("//location[location_name='" 
                       + locationName +"']/*").get(0)
            .getDocument().getRootElement();

您搜索树并获取请求的节点。但是,然后在所需的元素上调用getDocument().getRootNode(),这将为您提供文档的最上面的节点。

以上查询可以简化为:

Element location = (Element)doc.getRootElement();

这不是你想要的。

这有点像蹦极跳。你可以到达你需要的地方(元素)但是立即回到你来自的地方(根元素)。

答案 2 :(得分:0)

目前尚不清楚(至少对我来说)实际需要做些什么。从您的查询中,您应该获得与给定条件匹配的节点列表。您将获得NodeList,然后您可以迭代此NodeList并使用getNodeValue获取每个节点的内容。