如何在XML文件中插入处理指令?

问题描述 投票:0回答:2

我想使用 ElementTree (Python 3.8) 在 XML 文件中的根元素之前添加

xml-stylesheet
处理指令。

您可以在下面找到我用来创建 XML 文件的代码

import xml.etree.cElementTree as ET

def Export_star_xml( self ):
        star_element = ET.Element("STAR",**{ 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance' })
        element_node = ET.SubElement(star_element ,"STAR_1")
        element_node.text = "Mario adam"
        tree.write( "star.xml" ,encoding="utf-8", xml_declaration=True )

输出:

<?xml version="1.0" encoding="windows-1252"?>
<STAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <STAR_1> Mario adam </STAR_1>
</STAR>    

预期输出:

<?xml version="1.0" encoding="windows-1252"?>
<?xml-stylesheet type="text/xsl" href="ResourceFiles/form_star.xsl"?>
<STAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <STAR_1> Mario adam </STAR_1>
</STAR>
python python-3.x xml elementtree processing-instruction
2个回答
3
投票

我不知道如何使用 ElementTree 来做到这一点。这是一个使用 lxml 的解决方案,它为元素提供了

addprevious()
方法。

from lxml import etree as ET

# Note the use of nsmap. The syntax used in the question is not accepted by lxml
star_element = ET.Element("STAR", nsmap={'xsi': 'http://www.w3.org/2001/XMLSchema-instance'})
element_node = ET.SubElement(star_element ,"STAR_1")
element_node.text = "Mario adam"

# Create PI and and insert it before the root element
pi = ET.ProcessingInstruction("xml-stylesheet", text='type="text/xsl" href="ResourceFiles/form_star.xsl"')
star_element.addprevious(pi)

ET.ElementTree(star_element).write("star.xml", encoding="utf-8",
                                   xml_declaration=True, pretty_print=True)

结果:

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type="text/xsl" href="ResourceFiles/form_star.xsl"?>
<STAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <STAR_1>Mario adam</STAR_1>
</STAR>

0
投票

经过一个小时的努力才找到答案......

下面的代码在 python 3.12.3 下工作,使用 xml.etree.ElementTree 而不是 xml.etree.cElementTree (已弃用)

import xml.etree.ElementTree as ET

top = ET.Element(None)
top.append(ET.ProcessingInstruction("xml-stylesheet", "href='ResourceFiles/form_star.xsl' type='text/xsl'"))

star_element = ET.SubElement(top,"STAR",**{ 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance' })
element_node = ET.SubElement(star_element ,"STAR_1")
element_node.text = "Mario adam"
tree = ET.ElementTree(top)
tree.write( "star.xml" ,encoding="utf-8", xml_declaration=True )

结果:

<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet href='ResourceFiles/form_star.xsl' type='text/xsl'?>
<STAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <STAR_1>Mario adam</STAR_1>
</STAR>
© www.soinside.com 2019 - 2024. All rights reserved.