0

私は XML ファイルです。ルートには「testCase」という名前の 10 個のサブ子 (同じ階層) があります。

私は次のことを理解することができません: まず、すべてのサブ子を取得するために次のことを行っています:

for testCase in root.iter('testCase'):
  1. 最後のサブ子「testCase」から属性を取得する必要があります。しかし、それが最後の「testCase」であることをどのように知ることができますか。それらを数える方法はありますか?
  2. また、 iter() を経由せずに n 番目のサブチャイルドにアクセスする方法はありますか?
4

2 に答える 2

3

次のサンプルを試してください。以下の出力を参照してください。のコンテンツとして使用されたものを示しますmy.xml。要素は、子のリストとして動作します (つまり、反復することもできます)。必要なすべての要素をドキュメント順序で取得するための関数とイテレータがあります (つまり、それらの深さ、子などは関係ありません)。は属性のelement.attribディクショナリとして動作します。標準xml.etree.ElementTreeは XPath のサブセットもサポートします -- 末尾を参照してください:

import xml.etree.ElementTree as et

tree = et.parse('my.xml')
root = tree.getroot()     # the root element of the tree

et.dump(root)             # here is how the input file looks inside

# Any element behaves as a list of children. This way, the last child
# of the list can be accessed via negative index.
print '-------------------------------------------'
print root[-1]

# Here is the content.
print '-------------------------------------------'
et.dump(root[-1])

# If the elements could be not direct children, you can use findall('tag') to 
# get the list of the elements. Then you access it again as the last element
# of the list
print '-------------------------------------------'
lst = root.findall('testCase')
et.dump(lst[-1])

# The number of the 'testCase' elements is simply the length of the list.
print '-------------------------------------------'
print 'Num. of test cases:', len(lst)

# The elem.iter('tag') works similarly. But if you want the last element,
# you must know when the element is the last one. It means you have to 
# loop through all of them anyway.
print '-------------------------------------------'
last = None  # init
for e in root.iter('testCase'):
    last = e

et.dump(last)

# The attributes of the elements take the form of the dictinary .attrib.
print '-------------------------------------------'
print last.attrib
print last.attrib['name']

# The standard xml.etree.ElementTree supports a subset of XPath. You can use
# it if you are familiar with XPath.
print '-------------------------------------------'
third = root.find('.//testCase[3]')
et.dump(third)

# ... including the last() function. For more complex cases, use lxml
# as pointed out by Emmanuel.
print '-------------------------------------------'
last = root.find('.//testCase[last()]')
et.dump(last)

コンソールに次のように出力されます。

    c:\tmp\___python\Sunny\so12669404>python a.py
<root>
  <testCase name="a" />
  <testCase name="b" />
  <testCase name="c" />
  <testCase name="d" />
</root>
-------------------------------------------
<Element 'testCase' at 0x231a630>
-------------------------------------------
<testCase name="d" />
-------------------------------------------
<testCase name="d" />
-------------------------------------------
Num. of test cases: 4
-------------------------------------------
<testCase name="d" />
-------------------------------------------
{'name': 'd'}
d
-------------------------------------------
<testCase name="c" />

-------------------------------------------
<testCase name="d" />
于 2012-10-01T08:21:17.087 に答える
2

この種の操作に関しては、XML ツリーをブラウズするための一般的で簡単な方法であるXPathを使用する必要があります。標準の Python ElementTree は XPath をサポートしているとは思いませんが、lxmlはサポートしています(非常に一般的にも使用されています)。以下に例を示します。

最後の子を取得:

>>> text = """<Root>
    <Child name="child1" />
    <Child name="child2" />
    <Child name="child3" />
    <Child name="child4" />
    <Child name="child5" />
</Root>"""
>>> from lxml import etree
>>> root = etree.fromstring(text)
>>> last_tag = root.xpath('/Root/Child[last()]')[0]
>>> last_tag.attrib['name']
'child5'

要素番号 #n への直接アクセス:

>>> tag3 = root.xpath('/Root/Child[3]')[0]
>>> tag3.attrib['name']
'child3'
于 2012-10-01T08:23:03.997 に答える