16

タグ名の XML 名前空間を無視する方法はありますelementtree.ElementTreeか?

technicalContactすべてのタグを印刷しようとしています:

for item in root.getiterator(tag='{http://www.example.com}technicalContact'):
        print item.tag, item.text

そして、私は次のようなものを取得します:

{http://www.example.com}technicalContact blah@example.com

しかし、私が本当に欲しいのは:

technicalContact blah@example.com

接尾辞 (sans xmlns) のみを表示する方法はありますか?それよりも良い方法はありますか? xmlns を明示的に指定せずに要素を反復処理する方法はありますか?

4

2 に答える 2

8

適切なタグ名で終わるタグを見つけるために、要素ツリーを再帰的に検索するジェネレータを定義できます。たとえば、次のようなものです。

def get_element_by_tag(element, tag):
    if element.tag.endswith(tag):
        yield element
    for child in element:
        for g in get_element_by_tag(child, tag):
            yield g

これはtag、 で終わるタグをチェックするだけです。つまり、先頭の名前空間は無視されます。次に、次のように、必要なタグを反復処理できます。

for item in get_element_by_tag(elemettree, 'technicalContact'):
    ...

このジェネレーターの動作:

>>> xml_str = """<root xmlns="http://www.example.com">
... <technicalContact>Test1</technicalContact>
... <technicalContact>Test2</technicalContact>
... </root>
... """

xml_etree = etree.fromstring(xml_str)

>>> for item in get_element_by_tag(xml_etree, 'technicalContact')
...     print item.tag, item.text
... 
{http://www.example.com}technicalContact Test1
{http://www.example.com}technicalContact Test2
于 2012-06-27T13:25:56.807 に答える
1

私はいつも次のようなものを使ってしまいます

item.tag.split("}")[1][0:]
于 2012-06-27T13:00:24.257 に答える