我试图在python中使用Element Tree替换我的XML文件中的属性值。因此,删除了XML文件声明<?xml version='1.0'?>
。
Python版本是2.7.13,而doc提到了&#34;版本2.7中的更改:ElementTree API更新为1.3。&#34; In turn我们可以理解
tree.write("file.xml", xml_declaration=True)
将添加声明,但我无法从上述声明中添加声明本身。
像其他参考文献中提到的那样:
tree.write("file.xml",xml_declaration=True, encoding='UTF-8')
将该版本与编码参数一起编写,但我不希望在XML文件中出现这种情况。
只是添加带有版本号的XML声明的任何见解都会很棒!提前谢谢。
答案 0 :(得分:1)
因为这是elementTree
以外的复杂渲染,所以请考虑XSLT,这是专门用于转换XML文件的专用语言。 Python可以使用第三方模块lxml
运行XSLT 1.0脚本,或者通过命令行运行到Unix(Mac / Linux)xsltproc
之类的外部.exe。
具体来说,下面的XSLT脚本运行Identity Transform来按原样复制文档,并从头声明中删除编码并保留版本。
XSLT (另存为.xsl文件,一个特殊的.xml文件)
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:text disable-output-escaping="yes"><![CDATA[<?xml version="1.0"?>]]>
</xsl:text>
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
</xsl:stylesheet>
Python (使用lxml)
import lxml.etree as et
...
# LOAD XSL
xsl = et.parse('xslt_script.xsl')
# TRANSFORM ORIGINAL tree
transform = et.XSLT(xsl)
result = transform(tree)
# PRINT RESULT TO SCREEN
print(result)
# OUTPUT RESULT TO FILE
with open('output.xml', 'wb') as f:
f.write(result)
Python (使用命令行到xsltproc)
from subprocess import Popen
...
tree.write("file.xml", xml_declaration=True)
proc = Popen(['xsltproc -o output.xml xslt_script.xsl file.xml'],
shell=True, cwd='/path/to/working/directory',
stdin=None, stdout=None, stderr=None)