Xpath:XML中的非唯一节点名称

时间:2014-03-26 16:05:43

标签: xml xpath

我被要求编写一个程序来解析下面的XML ..

<crowd_response_row i="http://www.w3.org/2001/XMLSchema-instance">
        <crowd_response_data>
            <crowd_response_data>
                <project_id>184472</project_id>
                <approval_status_code>Pending</approval_status_code>
            </crowd_response_data>
            <crowd_response_data>
                <project_id>184475</project_id>
                <approval_status_code>Approved</approval_status_code>
            </crowd_response_data>

在我的程序中(用web-harvest编写),获取数据的唯一方法是使用xpath表达式。

<xpath expression="//crowd_response_data">

问题是因为有两种具有该名称的节点,当我只需要子节点(具有数据的节点)时,我的程序正在拾取两个节点。

是否可以修改该xpath表达式以仅获取子级,还是需要更改原始XML以使每个节点具有唯一名称?

感谢。

3 个答案:

答案 0 :(得分:1)

//(双正斜杠)将递归所有节点,您可以使用:

/crowd_response_row/crowd_response_data

...仅获取父节点,或:

//crowd_response_data/crowd_response_data

...获取任何 crowd_response_data节点,该节点是另一个crowd_response_data节点的子节点。

如果您想通过索引获取特定的子节点,可以使用方括号:

/crowd_response_row/crowd_response_data/crowd_response_data[1]

答案 1 :(得分:1)

提取你所追求的元素的最有效方法可能是

/crowd_response_row/crowd_response_data/crowd_response_data

但是对于更简单的表达式,您可以使用//crowd_response_data/crowd_response_data来获取crowd_response_data元素,这些元素本身就是另一个crowd_response_data的孩子,或/*/*/crowd_response_data所有crowd_response_data位于文档根目录下第三级的元素。

答案 2 :(得分:1)

限制查询

  

是否可以修改该xpath表达式以仅获取子项?

您可以使用谓词来限制<crowd_response_data/>使用<{1}}子元素的元素

<project_id/>

或查询作为另一个//crowd_response_data[project_id] 节点的子节点的所有<crowd_response_data/>元素:

<crowd_response_data/>

修复数据

  

或者我是否需要更改原始XML以使每个节点都具有唯一名称?

如果你能这样做,这可能是更好的主意,并在以后解决其他问题。那个//crowd_response_data/crowd_response_data 元素作为容器怎么样?

<crowd_responses/>