2017-04-12 70 views
0

我有以下代碼:Python XML:如何將節點內容視爲字符串?

from xml.etree import ElementTree 

tree = ElementTree.parse(file) 
my_val = tree.find('./abc').text 

這裏是一個XML片段:

<item> 
    <abc> 
    <a>hello</a> 
    <b>world</b> 
    awesome 
    </abc> 
</item> 

我需要stringmy_val包含

<a>hello</a> 
<b>world</b> 
awesome 

但它顯然解析爲None

+0

看看美麗的湯,它會適合你完美。 https://www.crummy.com/software/BeautifulSoup/bs4/doc/ – Mikael

回答

0

一種方式可能是通過獲取根元素

from xml.etree import ElementTree 
import string 

tree=ElementTree.parse(file) 
rootElem=tree.getroot() 

然後,我們可以從根獲得元素ABC和遍歷其子開始,利用孩子們的屬性格式化成一個字符串:

abcElem=root.find("abc") 
my_list = ["<{0.tag}>{0.text}</{0.tag}>".format(child) for child in abcElem] 
my_list.append(abcElem.text) 
my_val = string.join(my_list,"\n") 

我相信其他一些有用的靈魂知道使用ElementTree或其他xml實用工具來打印這些元素的方法,而不是自己格式化它們,但這應該讓你開始。

0

通過findall的迭代將給你一個子樹的元素列表。

>>> elements = [ElementTree.tostring(x) for x in tree.findall('./abc/')] 
    ['<a>hello</a>\n ', '<b>world</b>\n awesome\n '] 

這樣做的問題是沒有標記的文本會被添加到前一個標記。所以,你需要清潔,太多:

>>> split_elements = [x.split() for x in elements] 
    [['<a>hello</a>'], ['<b>world</b>', 'awesome']] 

現在我們需要被壓平列表的列表:

>>> print("\n".join(flatten_list)) 

>>> from itertools import chain 
>>> flatten_list = list(chain(*split_elements)) 
    ['<a>hello</a>', '<b>world</b>', 'awesome'] 

最後,你可以用它打印每行一個

0

回答我自己的問題:

這可能不是最好的解決方案,但它對我很有用

my_val = ElementTree.tostring(tree.find('./abc'), 'utf-8', 'xml').decode('utf-8') 
my_val = my_val.replace('<abc>', '').replace('</abc>', '') 
my_val = my_val.strip() 
+0

如果在主內有更多,則將失敗。 – VMRuiz