问题描述
对于这个xml
<Departments orgID="123" name="xmllist"> <Department> <orgID>124</orgID> <name>A</name> <type>type a</type> <status>Active</status> <Department> <orgID>125</orgID> <name>B</name> <type>type b</type> <status>Active</status> <Department> <orgID>126</orgID> <name>C</name> <type>type c</type> <status>Active</status> </Department> </Department> </Department> <Department> <orgID>109449</orgID> <name>D</name> <type>type d</type> <status>Active</status> </Department> </Departments>
如何在 python 中使用 lxml etree 获取节点的所有父节点.
How i can get all parents of a node using lxml etree in python.
预期输出:输入 orgid=126 ,它将返回所有喜欢的父母,
Expected output : Input orgid=126 , it will return all the parents like ,
{'A':124,'B':125,'C':126}
推荐答案
使用 lxml 和 XPath:
Using lxml and XPath:
>>> s = ''' ... <Departments orgID="123" name="xmllist"> ... <Department> ... <orgID>124</orgID> ... <name>A</name> ... <type>type a</type> ... <status>Active</status> ... <Department> ... <orgID>125</orgID> ... <name>B</name> ... <type>type b</type> ... <status>Active</status> ... <Department> ... <orgID>126</orgID> ... <name>C</name> ... <type>type c</type> ... <status>Active</status> ... </Department> ... </Department> ... </Department> ... <Department> ... <orgID>109449</orgID> ... <name>D</name> ... <type>type d</type> ... <status>Active</status> ... </Department> ... </Departments> ... '''
<小时>
使用ancestor-or-self轴,可以找到节点本身、父节点、祖父节点、...
Using ancestor-or-self axis, you can find the node itself, parent, grandparent, ...
>>> import lxml.etree as ET >>> root = ET.fromstring(s) >>> for target in root.xpath('.//Department/orgID[text()="126"]'): ... d = { ... dept.find('name').text: int(dept.find('orgID').text) ... for dept in target.xpath('ancestor-or-self::Department') ... } ... print(d) ... {'A': 124, 'C': 126, 'B': 125}