在Python中使用元素树时删除XML声明。只需要添加版本参数<! - ?xml version ='1.0'? - >

时间:2018-01-17 18:05:25

标签: python xml elementtree

我试图在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声明的任何见解都会很棒!提前谢谢。

1 个答案:

答案 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"?>]]>&#xa;</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)