2014-09-23 71 views
0

从xml中,我需要获取每个节点的名称和区域。Xpath从同一节点中选择多个属性

我知道样品的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之间插入任何静态文本,以便我们可以使用实用程序解析字符串吗?
  • 任何XPath表达式除了上面得到的值映射?(可使用适配器)

请帮帮忙!

[编辑]:

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

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

+1

你的路径表达式不会产生任何结果,'// XMLDependency/@名称| // XMLDependency/@ area'会。你为什么不测试一下'area'属性不存在时会发生什么?不知道你接下来两个“怀疑”是什么意思。你能展示你的Java代码吗? – 2014-09-23 07:14:46

+0

Im评估IntelliJ的XPATH表达式。该表达式产生如问题所示的结果。如果区域不存在,那么它产生为'Name1,JKL,Name2'。从Java方面我们无法处理这一点。因此,如果我们可以得到类似于'Name1:JKL,Name2:MNO'的结果,那么即使某个节点不包含区域,结果为Name1:JKL,Name2:。上述结果可以使用实用程序小心处理。但是,如何在'Name1'和'JKL'之间引入':'是我的第二个疑问。第三个我提到了使用任何其他XPATH表达式获取数据的其他方法。 – VinayVeluri 2014-09-23 09:10:51

+0

由于您在环境中使用代码(IntelliJ中的某些Java)来设置更改XPath表达式结果的上下文,因此您需要向我们显示该上下文。显然你将上下文节点设置为''元素?你用什么来在结果之间插入逗号?这不是来自您的XPath表达式。无论我们给出的答案都必须与Java代码中尚未显示的东西进行整合。 – LarsH 2014-09-23 15:09:48

回答

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); 
相关问题