2013-04-29 51 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