Python使用lxml向XML添加标记

Python使用lxml向XML添加标记,python,xml,lxml,Python,Xml,Lxml,我有以下输入XML: <?xml version="1.0" encoding="utf-8"?> <Scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Scenario.xsd"> <TestCase>test_startup_0029</TestCase> <ShortDescription>

我有以下输入XML:

<?xml version="1.0" encoding="utf-8"?>
<Scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Scenario.xsd">
  <TestCase>test_startup_0029</TestCase>
  <ShortDescription>Restart of the EVC with missing ODO5 board.</ShortDescription>
  <Events>
    <Event Num="1">Switch on the EVC</Event>
  </Events>
  <HW-configuration>
    <ELBE5A>true</ELBE5A>
    <ELBE5K>false</ELBE5K>
  </HW-configuration>
  <SystemFailure>true</SystemFailure>
</Scenario>

我的问题是如何以正确的格式将新标记添加到XML中。我想它的工作方式是再次解析更改后的XML,但它的格式不好。有什么想法吗?提前感谢。

为确保打印输出美观,您需要做两件事:

  • 使用带有
    remove\u blank\u text=True的对象解析输入文件
  • 使用
    pretty\u print=True写入输出
  • 例如:

    from lxml import etree
    
    parser = etree.XMLParser(remove_blank_text=True)
    tree = etree.parse("Test_startup_0029.xml", parser)
    root = tree.getroot()
    
    duration_tag = etree.SubElement(root, "Duration")
    duration_tag.text = "12"
    
    sw_version_tag = etree.SubElement(root, "EVC-SW-Version")
    sw_version_tag.text = "08.02.0001.0027"
    
    stac_release_tag = etree.SubElement(root, "STAC-Release")
    stac_release_tag.text = "08.02.0001.0027"
    
    tree.write("output.xml", pretty_print=True)
    
    output.xml的内容:

    <Scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Scenario.xsd">
      <TestCase>test_startup_0029</TestCase>
      <ShortDescription>Restart of the EVC with missing ODO5 board.</ShortDescription>
      <Events>
        <Event Num="1">Switch on the EVC</Event>
      </Events>
      <HW-configuration>
        <ELBE5A>true</ELBE5A>
        <ELBE5K>false</ELBE5K>
      </HW-configuration>
      <SystemFailure>true</SystemFailure>
      <Duration>12</Duration>
      <EVC-SW-Version>08.02.0001.0027</EVC-SW-Version>
      <STAC-Release>08.02.0001.0027</STAC-Release>
    </Scenario>
    
    
    测试\u启动\u 0029
    在缺少ODO5板的情况下重新启动EVC。
    打开EVC
    真的
    假的
    真的
    12
    08.02.0001.0027
    08.02.0001.0027
    

    另请参见。

    所需的输出是什么,或者您所说的正确格式是什么意思?你是指换行和缩进吗?谢谢,效果很好。我一直在寻找类似的东西。
    from lxml import etree
    
    parser = etree.XMLParser(remove_blank_text=True)
    tree = etree.parse("Test_startup_0029.xml", parser)
    root = tree.getroot()
    
    duration_tag = etree.SubElement(root, "Duration")
    duration_tag.text = "12"
    
    sw_version_tag = etree.SubElement(root, "EVC-SW-Version")
    sw_version_tag.text = "08.02.0001.0027"
    
    stac_release_tag = etree.SubElement(root, "STAC-Release")
    stac_release_tag.text = "08.02.0001.0027"
    
    tree.write("output.xml", pretty_print=True)
    
    <Scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Scenario.xsd">
      <TestCase>test_startup_0029</TestCase>
      <ShortDescription>Restart of the EVC with missing ODO5 board.</ShortDescription>
      <Events>
        <Event Num="1">Switch on the EVC</Event>
      </Events>
      <HW-configuration>
        <ELBE5A>true</ELBE5A>
        <ELBE5K>false</ELBE5K>
      </HW-configuration>
      <SystemFailure>true</SystemFailure>
      <Duration>12</Duration>
      <EVC-SW-Version>08.02.0001.0027</EVC-SW-Version>
      <STAC-Release>08.02.0001.0027</STAC-Release>
    </Scenario>