如何在python中从Elementtree获取孙子元素
假设我有这样一个XML代码:如何在python中从Elementtree获取孙子元素,python,elementtree,Python,Elementtree,假设我有这样一个XML代码: <root> <a> <b> .... </b> <c> .... </c> <d> .... </d> </a> <d><c></c>&l
<root>
<a>
<b>
....
</b>
<c>
....
</c>
<d>
....
</d>
</a>
<d><c></c><a></a></d>
</root>
....
....
....
是否有一个函数可以获取给定子节点的孙子元素?
例如,在上面的XML代码中,如果我传递'd',我希望它返回'c'和'a'
我尝试了getChildren(),但我想这会返回属性,但不会返回children元素。顺便说一句,我连属性都没有
谢谢。根元素是可编辑的:
>>> 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>
如果需要标记而不是ElementTree对象:
>>> [e.tag for e in root.find("d")]
['c', 'a']
请注意,
表示一个ElementTree元素
对象(与根对象
相同),其API定义为,因为根对象是树的根:
>>> [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>]
>>[grchild for child for child in root for grchild in child]
[,
, ]
好,让我们用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>
def递归(节点):
对于节点中的子节点:
印刷品(儿童)
递归(子)
>>>node=root.find('d')
>>>递归(节点)
假设您已经解析了文档,[i.getchildren()for i in root.findall('d')]
可能就是您想要的
更一般地说,您可以有一个函数
def getGrandChildOfTag(tagName, root):
return [i.getchildren() for i in root.findall(tagName)]
getChildren确实返回子元素。为什么你猜它会返回属性,而你却没有属性?@zaphod,当我尝试时,它没有返回任何东西。。。让我解释一下我做了什么。在上面的例子中,say是根元素,我想要它的子元素。是的,list=d.getChildren()。这里的d是我做了孩子后返回的任何东西。谢谢你的回复。但这不是我要问的。您的代码只返回a和d。我想完成的是当我通过d时,我想得到c和a。看看这个例子,d已经是一个子元素,我想得到,也许我应该说,那个子元素的孙子。root.getchildren()还返回一个子元素的列表elements@Nayana:[i.getchildren()for i in root.find('d')]可能就是您想要的@扎菲德,非常感谢你的帮助。我试过了。只返回“d”及其内存地址。。。我想没有函数可以返回给定子元素的孙子列表?谢谢@SeanBreckenridge,刚刚为新的API版本修复了它。我不确定你在做什么,但这肯定不是我想要做的。。。如果您查看示例XML代码,当我传递第二个根元素时,它是'd',我想得到它的外子元素,即'a'和'c'。您不能随意传递一个级别n的标记名。您需要知道用于此目的的xpath,并将xpath提供给find方法!我真的认为getChildren()返回属性,因为当我运行它时,它给了我“AttributeError:‘Element’对象没有属性‘getChildren’”。首先,它是getChildren,而不是getChildren。其次,属性错误是由于您试图调用不属于该对象的方法而引发的python错误。它与xml属性无关!
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>
def getGrandChildOfTag(tagName, root):
return [i.getchildren() for i in root.findall(tagName)]