1

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

<root>
    <a>
        <b>
           ....
        </b>
        <c>
           ....
        </c>
        <d>
           ....
        </d>
    </a>
    <d><c></c><a></a></d>
</root>

是否有一个函数可以获取给定某个子节点的孙元素?例如,在上面的 XML 代码中,如果我传递 'd',我希望它返回 'c' 和 'a'。

我试过 getChildren(),但我猜这会返回属性,而不是子元素。顺便说一句,我什至没有属性。

谢谢你。

4

3 回答 3

3

根元素是可迭代的:

>>> 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>表示一个 ElementTreeElement对象(与 相同root),其 API在文档中定义

于 2013-06-25T09:52:55.043 回答
0

假设您已经解析了文档, [i.getchildren() for i in root.findall('d')]这可能就是您想要的!

为了更通用,你可以有一个功能


def getGrandChildOfTag(tagName, root):
    return [i.getchildren() for i in root.findall(tagName)]

于 2013-06-25T10:07:21.660 回答
0

鉴于这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>
于 2013-06-25T10:05:02.447 回答