5

できればPython 2.7のxml.etreeモジュールを使用して、次のスケルトンを持つようにXMLファイルを作成しようとしています:

<?xml version="1.0"?>
<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" thing1="this" thing2="that">
  ....
  <somedata bar="1">
    <moredata whatsit="42"></moredata>
  </somedata>
  ....
</foo>

私を悩ませているのは「foo ....」の行です。xsi と xsd を取り込むために nsmap を使用しようとしましたが、「シリアル化できません」というエラーが発生しました。

その行のテキストを作成またはハッキングして、希望どおりにすることもできますが、xml.etree を使用してプログラムでこれを行う方法を学びたいと思います(この状況では、外部ライブラリをプルすることはお勧めできません)。

これは一般的なパターンだと思いますが、Python と etree のどこにも見つかりません。

4

2 に答える 2

5

ドキュメントでプレフィックスが使用されている場合。register_namespace()それらを追加するために呼び出すことができます:

import sys
import xml.etree.ElementTree as etree

xsi =  "http://www.w3.org/2001/XMLSchema-instance"
xsd =  "http://www.w3.org/2001/XMLSchema"
ns = {"xmlns:xsi": xsi, "xmlns:xsd": xsd}
for attr, uri in ns.items():
    etree.register_namespace(attr.split(":")[1], uri)

foo = etree.Element("foo",
    dict(thing1="this", thing2="that")) # put `**ns))` if xsi, xsd are unused
somedata = etree.SubElement(foo, "somedata", dict(bar="1"))
etree.SubElement(somedata, "moredata",
    {"whatsit": "42", etree.QName(xsi, "type"): etree.QName(xsd, "string")})

etree.ElementTree(foo).write(sys.stdout, xml_declaration=True)

それ以外の場合は、必要に応じて属性を明示的に設定できます ( nsdict )。

于 2013-06-13T12:21:06.747 に答える