Xpath从同一节点选择多个属性

时间:2014-09-23 07:02:59

标签: java xml xpath

从xml中,我需要获取每个节点的名称和区域。

我知道样本xpath,

XMLDependency/@name|XMLDependency/@area,它以逗号分隔值

输出:

Name1, JKL, Name2, MNO

XML:

<DocBuild name="ABCD">
<XMLDependency name="Name1" product="Product ABC" area="JKL" />
<XMLDependency name="Name2" product="Product DEF" area="MNO" />
<XMLDependency name="Name3" product="Product GHI" area="PQR" />
</DocBuild>

疑惑:

  • 如果area对于节点不是必需的(值可能存在或不存在),如何处理。
  • 我们可以在namearea之间插入任何静态文本,以便我们可以使用实用程序解析String吗?
  • 除了上面的任何Xpath表达式以获取要映射的值?(可能正在使用适配器)

请帮忙!

[编辑]:

这是我开始使用的Java程序。

    XPath xPath = XPathFactory.newInstance().newXPath();
    NodeList nodeList = (NodeList) xPath.compile("//XMLDependency/@name|//XMLDependency/@area")
        .evaluate(element, XPathConstants.NODESET);
    List<String> nodes = new ArrayList<String>();
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        nodes.add(node.getNodeValue());
    }
    System.out.println(nodes);

使用节点类型和节点值进行处理让我首先解决了问题。

1 个答案:

答案 0 :(得分:3)

单独使用XPath无法实现您想要做的事情。您需要为每个XMLDependency迭代一次,并从那里开始合并值:

XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodeList = (NodeList) xPath.compile("//XMLDependency")
                                    .evaluate(element, XPathConstants.NODESET);

List<String> nodes = new ArrayList<String>();

for (int i = 0; i < nodeList.getLength(); i++) {
    NamedNodeMap att = nodeList.item(i).getAttributes();

    Node name = att.getNamedItem("name");
    Node area = att.getNamedItem("area");

    nodes.add(name.getNodeValue() + ":" + 
              (area != null ? area.getNodeValue() : ""));
}

System.out.println(nodes);