假设我有一个类似以下的XML代码:
<root>
<a>
<b>
....
</b>
<c>
....
</c>
<d>
....
</d>
</a>
<d><c></c><a></a></d>
</root>
有没有一个函数可以在给定某个子节点的情况下获取孙元素?例如,在上面的XML代码中,如果我传递"d",我希望它返回"c"one_answers"a"。
我尝试过getChildren(),但我想这会返回属性,但不会返回children元素。我甚至没有属性btw.
谢谢。
根元素是可迭代的:
>>> import xml.etree.ElementTree as ET
>>> xml = "<root><a><b>....</b><c>....</c><d>....</d></a><d><c></c><a></a></d></root>"
>>> root = ET.fromstring(xml)
>>> root
<Element 'root' at 0x7fa86a7ea610>
>>> for child in root:
... print(child)
...
<Element 'a' at 0x7fa86a7ea650>
<Element 'd' at 0x7fa86a7ea810>
获取特定孙元素:
>>> root = ET.fromstring(xml)
>>> root.find("d")
[<Element 'd' at 0x10d7869a8>]
find()
方法将查找第一个匹配的子项。请注意,这只是子元素。我们可以通过迭代子元素来找到孙元素:
>>> for e in root.find("d"):
... print(e)
...
<Element 'c' at 0x10d82ec28>
<Element 'a' at 0x10d82ec78>
如果你想要标签而不是ElementTree对象:
>>> [e.tag for e in root.find("d")]
['c', 'a']
请注意,<Element 'c' at 0x7fce44939650>
表示ElementTree Element
对象(与root
相同),其API在文档中定义
假设root
是树的根:
>>> [grchild for child in root for grchild in child]
[<Element 'b' at 0xb6cbad4c>, <Element 'c' at 0xb6cbaedc>,
<Element 'd' at 0xb6cbad24>, <Element 'c' at 0xb6cbaaa4>]
好的,让我们用Haskell的方法写一个递归函数:
def recurse(node):
for child in node:
print(child)
recurse(child)
>>> node = root.find('d')
>>> recurse(node)
<Element 'c' at 0xb6cbaaa4>
<Element 'a' at 0xb6cbac0c>
假设您已经解析了文档,[i.getchildren() for i in root.findall('d')]
可能就是您想要的!
为了更通用,你可以有一个功能
def getGrandChildOfTag(tagName, root):
return [i.getchildren() for i in root.findall(tagName)]