Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中从Elementtree获取孙子元素_Python_Elementtree - Fatal编程技术网

如何在python中从Elementtree获取孙子元素

如何在python中从Elementtree获取孙子元素,python,elementtree,Python,Elementtree,假设我有这样一个XML代码: <root> <a> <b> .... </b> <c> .... </c> <d> .... </d> </a> <d><c></c>&l

假设我有这样一个XML代码:

<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)]