我有一个xml文件,我使用Elementtree将新标签添加到xml文件。我在处理之前的xml文件如下
<?xml version="1.0" encoding="utf-8"?>
<PackageInfo xmlns="http://someurlpackage">
<data ID="http://someurldata1">data1</data >
<data ID="http://someurldata2">data2</data >
<data ID="http://someurldata3">data3</data >
</PackageInfo>
我使用以下python代码添加新数据标记并将其写入我的xml文件
tree = ET.ElementTree(xmlFile)
root = tree.getroot()
elem= ET.Element('data')
elem.attrib['ID']="http://someurldata4"
elem.text='data4'
root[1].append(elem)
tree = ET.ElementTree(root)
tree.write(xmlFile)
但是生成的xml文件缺少<?xml version="1.0" encoding="utf-8"?>
,文件如下所示
<PackageInfo xmlns="http://someurlpackage">
<data ID="http://someurldata1">data1</data >
<data ID="http://someurldata2">data2</data >
<data ID="http://someurldata3">data3</data >
</PackageInfo>
是否有任何方法可以包含xml标头而不是硬编码行
答案 0 :(得分:8)
看起来你需要write
方法的可选参数来输出声明。
http://docs.python.org/library/xml.etree.elementtree.html#elementtree-elementtree-objects
tree.write(xmlfile,xml_declaration=True)
我担心我对xml.etree.ElementTree
并不熟悉,而且它是python版本之间的差异。
这是使用lxml.etree
:
>>> from lxml import etree
>>> sample = """<?xml version="1.0" encoding="utf-8"?>
... <PackageInfo xmlns="http://someurlpackage">
... <data ID="http://someurldata1">data1</data >
... <data ID="http://someurldata2">data2</data >
... <data ID="http://someurldata3">data3</data >
... </PackageInfo>"""
>>>
>>> doc = etree.XML(sample)
>>> data = doc.makeelement("data")
>>> data.attrib['ID'] = 'http://someurldata4'
>>> data.text = 'data4'
>>> doc.append(data)
>>> etree.tostring(doc,xml_declaration=True)
'<?xml version=\'1.0\' encoding=\'ASCII\'?>\n<PackageInfo xmlns="http://someurlpackage">\n<data ID="http://someurldata1">data1</data>\n<data ID="http://someurldata2">data2</data>\n<data ID="http://someurldata3">data3</data>\n<data ID="http://someurldata4">data4</data></PackageInfo>'
>>> etree.tostring(doc,xml_declaration=True,encoding='utf-8')
'<?xml version=\'1.0\' encoding=\'utf-8\'?>\n<PackageInfo xmlns="http://someurlpackage">\n<data ID="http://someurldata1">data1</data>\n<data ID="http://someurldata2">data2</data>\n<data ID="http://someurldata3">data3</data>\n<data ID="http://someurldata4">data4</data></PackageInfo>'
答案 1 :(得分:3)
试试这个:::
tree.write(xmlFile, encoding="utf-8")
答案 2 :(得分:0)
如果您使用 python&lt; = 2.6
ElementTree.write()中没有 xml_declaration 参数
def write(self, file, encoding="us-ascii"):
def _write(self, file,node, encoding, namespaces):
您可以使用 lxml.etree
install lxml
样本在这里:
from lxml import etree
document = etree.Element('outer')
node = etree.SubElement(document, 'inner')
print(etree.tostring(document, xml_declaration=True))
顺便说一句:
我发现没有必要编写xml_declaration
Is the XML declaration node mandatory?
文档不需要XML声明 成功可读,因为版本和版本都有默认值 编码(分别为1.0和UTF-8)。
至少,即使AndroidManifest.xml没有xml_declaration,它也能正常工作 我试过了: - )