1

XML 文件:

<testcases>
    <mode>PRESSURE_CONTROL</mode>
    <category>ADULT</category>
    <testcase id="1">
        <parameter id="PEEP" value="1.000000">false</parameter>
        <parameter id="CMV_FREQ" value="4.0">false</parameter>
        <parameter id="PRESS_ABOVE_PEEP" value="0.0">true</parameter>
        <parameter id="I_E_RATIO" value="0.100000">false</parameter>
    </testcase>
</testcases>

Python代码:

import xml.etree.ElementTree as ET

tree = ET.parse('Results.xml')    
root = tree.getroot()

mode = root.find('Mode').text
category = root.find('Category').text

        self.tag_invalid = ET.SubElement(root, 'invalid')    # For adding new  tag with attributes and values      
        for v in self.final_result:
            self.tag_testcase = ET.SubElement(self.tag_invalid, 'testcase')
            self.tag_testcase.attrib['id'] = 5
            self.tag_testcase.attrib['parameter'] = 'IE'
            self.tag_testcase.text = 100
            tree.write('/home/AlAhAb65/Desktop/test.xml')

输出:

<testcases>
    <mode>PRESSURE_CONTROL</mode>
    <category>ADULT</category>
    <testcase id="1">
        <parameter id="PEEP" value="1.000000">false</parameter>
        <parameter id="CMV_FREQ" value="4.0">false</parameter>
        <parameter id="PRESS_ABOVE_PEEP" value="0.0">true</parameter>
        <parameter id="I_E_RATIO" value="0.100000">false</parameter>
    </testcase>
<invalid><testcase id="5" parameter="I_E_RATIO">100.0</testcase></invalid></testcases>  # Extra line after python code running

XML 文件中添加了额外的行。但问题是我无法格式化它。这意味着我不能添加 '\n'、'\t' 来维护层次结构和格式。有什么规则吗?我尝试了 tree.write()、ET.Element() 函数。但那些并没有提供预期的结果。

4

3 回答 3

2

ElementTree您可以使用属性tail和控制元素的文本内容text。例如,尝试添加:

self.tag_invalid.text = "\n    "
self.tag_invalid.tail = "\n      "

以此为起点,尝试将文本/尾部添加到您创建的各种其他元素中,打印结果,然后尝试使用它,直到它为您提供所需的内容。

这是一个示例,显示了 text 和 tail 的含义:

<A>TEXT_OF_A<B>TEXT_OF_B</B>TAIL_OF_B<C>TEXT_OF_C</C>TAIL_OF_C<D/>TAIL_OF_D</A>TAIL_OF_A

或者,您可以编写一个遍历 xml 树的递归函数,设置 text 和 tail 属性以正确缩进(相对于深度)。

有关texttail属性的更多文档,请参阅:http ://docs.python.org/2/library/xml.etree.elementtree.html

编辑:查看http://effbot.org/zone/element-lib.htm#prettyprint以查看如何递归遍历 xml 树、设置文本和尾部以使所有元素缩进的示例它们的嵌套深度。

于 2013-04-29T20:12:57.973 回答
2

如果您希望 XML 文本文件的缩进能够直观地表示 XML 文档的层次结构,则需要对其进行漂亮打印。一种方法是使用xmllint --format

$ xmllint --format test.xml 
<?xml version="1.0"?>
<testcases>
  <mode>PRESSURE_CONTROL</mode>
  <category>ADULT</category>
  <testcase id="1">
    <parameter id="PEEP" value="1.000000">false</parameter>
    <parameter id="CMV_FREQ" value="4.0">false</parameter>
    <parameter id="PRESS_ABOVE_PEEP" value="0.0">true</parameter>
    <parameter id="I_E_RATIO" value="0.100000">false</parameter>
  </testcase>
  <invalid>
    <testcase id="5" parameter="I_E_RATIO">100.0</testcase>
  </invalid>
</testcases>

如果您想生成已经打印好的文本文件,请尝试使用不同的 XML 库重新解析它,例如 minidom:

>>> print minidom.parseString(
            ET.tostring(
              tree.getroot(),
              'utf-8')).toprettyxml(indent=" ")

但请注意,这些解决方案中的每一个都会更改 XML 文档。严格来说,生成的文本文件并不等同于原始文件——文本元素添加了额外的空格和换行符。

于 2013-04-29T16:15:07.423 回答
0

根据ET 手册

将元素树或元素结构写入 sys.stdout。此功能应仅用于调试。

确切的输出格式取决于实现。在这个版本中,它被编写为一个普通的 XML 文件。

但是在谷歌上有一些修复

于 2013-04-29T15:49:10.673 回答