35

XML 宣言と名前空間を含む要素ツリーを含む XML ファイルを発行しようとしています。ここに私のサンプルコードがあります:

from xml.etree import ElementTree as ET
ET.register_namespace('com',"http://www.company.com") #some name

# build a tree structure
root = ET.Element("STUFF")
body = ET.SubElement(root, "MORE_STUFF")
body.text = "STUFF EVERYWHERE!"

# wrap it in an ElementTree instance, and save as XML
tree = ET.ElementTree(root)

tree.write("page.xml",
           xml_declaration=True,
           method="xml" )

ただし、<?xmlタグも名前空間/プレフィックス情報も出てきません。私はここで少し混乱しています。

4

2 に答える 2

43

ドキュメントにはそうではないと書かれてい<?xml>ますが、xml_declaration と encoding の両方を指定して宣言を取得することしかできませんでした。

ファイル内のノードの名前空間を取得するには、登録した名前空間でノードを宣言する必要があります。コードの修正バージョンは次のとおりです。

from xml.etree import ElementTree as ET
ET.register_namespace('com',"http://www.company.com") #some name

# build a tree structure
root = ET.Element("{http://www.company.com}STUFF")
body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF")
body.text = "STUFF EVERYWHERE!"

# wrap it in an ElementTree instance, and save as XML
tree = ET.ElementTree(root)

tree.write("page.xml",
           xml_declaration=True,encoding='utf-8',
           method="xml")

出力 (page.xml)

<?xml version='1.0' encoding='utf-8'?><com:STUFF xmlns:com="http://www.company.com"><com:MORE_STUFF>STUFF EVERYWHERE!</com:MORE_STUFF></com:STUFF>

ElementTree もきれいに印刷されません。きれいに印刷された出力は次のとおりです。

<?xml version='1.0' encoding='utf-8'?>
<com:STUFF xmlns:com="http://www.company.com">
    <com:MORE_STUFF>STUFF EVERYWHERE!</com:MORE_STUFF>
</com:STUFF>

デフォルトの名前空間を宣言することもでき、登録する必要はありません。

from xml.etree import ElementTree as ET

# build a tree structure
root = ET.Element("{http://www.company.com}STUFF")
body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF")
body.text = "STUFF EVERYWHERE!"

# wrap it in an ElementTree instance, and save as XML
tree = ET.ElementTree(root)

tree.write("page.xml",
           xml_declaration=True,encoding='utf-8',
           method="xml",default_namespace='http://www.company.com')

出力(きれいな印刷間隔は私のものです)

<?xml version='1.0' encoding='utf-8'?>
<STUFF xmlns="http://www.company.com">
    <MORE_STUFF>STUFF EVERYWHERE!</MORE_STUFF>
</STUFF>
于 2011-02-15T03:00:26.110 に答える
8

プログラムで要素ツリー ライブラリからタグを取得できなかった<?xmlので、このようなことを試してみることをお勧めします。

from xml.etree import ElementTree as ET
root = ET.Element("STUFF")
root.set('com','http://www.company.com')
body = ET.SubElement(root, "MORE_STUFF")
body.text = "STUFF EVERYWHERE!"

f = open('page.xml', 'w')
f.write('<?xml version="1.0" encoding="UTF-8"?>' + ET.tostring(root))
f.close()

std lib 以外の python ElementTree 実装では、名前空間を指定する方法が異なる場合があるため、lxml に移行する場合は、それらを宣言する方法が異なります。

于 2011-02-14T22:39:39.667 に答える