6

我有一个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 标头而不是硬编码该行

4

3 回答 3

10

看起来您需要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>'
于 2012-09-17T10:33:59.390 回答
4

尝试这个:::

tree.write(xmlFile, encoding="utf-8")
于 2012-09-17T13:02:29.737 回答
0

如果您使用的是python <=2.6 ElementTree.write()
中没有xml_declaration参数

def write(self, file, encoding="us-ascii"): 
def _write(self, file,node, encoding, namespaces):

您可以在此处使用lxml.etree
安装 lxml
示例:

from lxml import etree
document = etree.Element('outer')
node = etree.SubElement(document, 'inner')
print(etree.tostring(document, xml_declaration=True))

BTW:
我发现不需要写xml_declaration
XML声明节点是强制性的吗?

成功读取文档不需要 XML 声明,因为版本和编码(分别为 1.0 和 UTF-8)都有默认值。

至少,即使 AndroidManifest.xml 没有
我尝试过的 xml_declaration,它也可以工作:-)

于 2015-07-09T06:52:14.130 回答