2013-04-29 55 views
0

XML文件格式:XML与Python的ElementTree

<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()函数。但那些不提供所需的结果。

+1

用ET格式的文件取决于实现。你没有任何控制权。 – Vyktor 2013-04-29 15:44:37

+0

那我该如何保持层次呢? – ahadcse 2013-04-29 15:48:38

+0

从不完整的代码中您不清楚您尝试达到的目标。请发布一个[简短的,自包含的,可运行的示例程序](http://sscce.org)。 – 2013-04-29 15:55:09

回答

0

根据ET manual

写入一个元素树或元件结构sys.stdout来。该功能只能用于调试。

确切的输出格式是依赖于实现的。在这个版本中,它被写成普通的XML文件。

但在那里有​​。

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文档。严格来说, 生成的文本文件是而不是等同于原始文本元素 - 文本元素添加了额外的空格和换行符。

1

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

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

使用为出发点,并尝试添加文本/尾创建各种其他元素,打印结果,和玩它,直到它给你想要的东西。

这里是展示哪些文字和尾均值为例:

<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树走一个递归函数,同时设置文本&尾属性正确缩进它(相对于深度)。

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

编辑:看看http://effbot.org/zone/element-lib.htm#prettyprint看你怎么可以递归遍历XML树走一个例子,将文本&尾所以所有元素都将缩进到它们的嵌套深度。

+0

谢谢Edward Loper。你的回答很有帮助。但是我想知道是否可以在特定位置只写一个标签“\ t”而不使用标签。例如,ET.anymethod('\ t')或ET.Element('\ t')或类似的东西。不使用self.tag.text或self.tag.tail。再次感谢 – ahadcse 2013-04-30 09:59:27

+0

因为考虑了第一个标签。如果你在此之前需要写\ t或\ n,你怎么能这样做?因为你还没有制作标签 – ahadcse 2013-04-30 10:06:00

+0

'.text'和'.tail'元素覆盖了你可能想要放置文本的所有地方。看看我的例子,看看我的意思。如果你想在元素'e'的开放标签之后(但在任何包含的元素之前)放置一个'\ t',那么使用'e.text'。如果你想把它放在'e'的close标签后面,那么使用'e.tail'。如果你想在两个元素之间放置文本,则使用第一个元素的“tail”。确实,你不能在顶层元素之前放置文本(在你的例子中为''),但你可以把文本放在其他地方。 – 2013-04-30 16:09:50