我被要求编写一个程序来解析下面的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以使每个节点具有唯一名称?
感谢。
答案 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/>