8

これで名前空間を登録しようとしました:

ET.register_namespace("inv", "http://www.stormware.cz/schema/version_2/invoice.xsd")

しかし、それは機能しません:

Traceback (most recent call last):
  File "C:\tutorial\temp_xml2.py", line 34, in module>
    for listInvoice in root.findall('inv:invoiceHeader'):
  File "C:\Python27\LIB\xml\etree\ElementTree.py", line 390, in findall
    return ElementPath.findall(self, path, namespaces)
  File "C:\Python27\LIB\xml\etree\ElementPath.py", line 293, in findall
    return list(iterfind(elem, path, namespaces))
  File "C:\Python27\LIB\xml\etree\ElementPath.py", line 259, in iterfind
    token = next()
  File "C:\Python27\LIB\xml\etree\ElementPath.py", line 83, in xpath_tokenizer
    raise SyntaxError("prefix %r not found in prefix map" % prefix)
SyntaxError: prefix 'inv' not found in prefix map
>>>

これの何が問題なのですか?


ありがとうマルティニ

私が試した - 1.:

for listInvoice in root.findall('inv:invoiceHeader', namespaces=dict(inv='http://www.stormware.cz/schema/version_2/invoice.xsd')):
    invoiceHeader = listInvoice.find('inv:id', namespaces=dict(inv='http://www.stormware.cz/schema/version_2/invoice.xsd')).text
    print invoiceHeader

結果: (空)

2.:

nsmap=root.nsmap
print nsmap

結果: AttributeError: 'Element' オブジェクトに属性 'nsmap' がありません

3.:

for listInvoice in root.findall('.//{http://www.stormware.cz/schema/version_2/invoice.xsd}invoiceHeader'):
    invoiceHeader = listInvoice.find('.//{http://www.stormware.cz/schema/version_2/invoice.xsd}id').text
    print invoiceHeader

結果: 正常に動作します。

一度に名前空間を登録する機会はありますか? 次に、listInvoice.find('.//{http://www.stormware.cz/schema/version_2/invoice.xsd}id') の代わりに listInvoice.find('inv:id').text を使用したいと思います。 .text (より良いコードで読みやすい)

4

1 に答える 1

19

名前空間と の使用方法に関するドキュメントが更新されていないよう.findall()です。

.findall()関数 (および.iterfind ().find()の名前空間` 引数は、マッピングであると想定されています。これは、タグを見つけるときに参照される唯一の構造です。.findtext() and) takes a

root.findall('inv:invoiceHeader', namespaces=dict(inv='http://www.stormware.cz/schema/version_2/invoice.xsd'))

この.register_namespace()関数は、ツリーをテキストに再度シリアル化する場合にのみ役立ちます。

于 2013-01-02T15:23:08.743 に答える