2015-11-26 91 views
1

我在閱讀XML時遇到問題。我想獲得一個2D數組。但是,當我從XML獲取數據時,數據類型是Unicode。因此,我輸入list()。但是,結果不是我想要的。我可以用另一種方式獲得2D列表嗎?Python如何從XML等列表中獲取列表?

如何刪除u,\ n,\ t並獲得正確答案?謝謝。

abc.xml

<text> 
    <item id="1"> 
     [[2, 2, 1], 
     [1, 0, 0], 
     [1, 0, 0]] 
    </item> 
</text> 

PYTHON:

import xml.dom.minidom 

dom = xml.dom.minidom.parse('abc.xml') 

bb = dom.getElementsByTagName('item') 
b=bb[0] 

l= b.firstChild.data 
print l 

a=list(l) 
print a 

輸出:

[[2, 2, 1] 
[1, 0, 0] 
[1, 0, 0]] 

[u'\n', u' ', u' ', u' ', u' ', u'\t', u'\t', u'[', u'\n', u' ', u' ', u' ', u' ', u'\t', u'\t', u'\t', u'[', u'2', u',', u' ', u'2', u',', u' ', u'1', u']', u'\n', u' ', u' ', u' ', u' ', u'\t', u'\t', u'\t', u'[', u'1', u',', u' ', u'0', u',', u' ', u'0', u']', u' ', u'\n', u' ', u' ', u' ', u' ', u'\t', u'\t', u'\t', u'[', u'1', u',', u' ', u'0', u',', u' ', u'0', u']', u' ', u'\n', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u'\n', u' ', u' ', u' ', u' ', u'\t', u'\t', u']', u'\n', u' ', u' ', u' ', u' ', u'\t'] 
[Finished in 0.1s] 
+0

你將不得不在你自己的'l'變量中解析文本。 – furas

+0

我認爲'a = eval(l)'應該可以工作 –

+0

'eval'應該用於極端的預防措施,因爲它會優於任何代碼,而不僅僅是返回一個列表。 – MartinStettner

回答

1

這個問題是非常相似的一個老:Convert string representation of list to list in Python

總之,要解析一個unicode字符串(u"[\n[1,2,3],\n...")轉換爲python列表文字,因此您希望在執行讀取和解析程序時執行python解釋器執行的相同操作。你的情況

import ast 
a=ast.literal_eval(l) 

可以使用ast模塊這一點。請注意,此功能將評估任何蟒蛇文字,所以如果你只是把"1"在你的XML,結果a將是數1

更多解釋見的documentation for ast.literal_evel

+0

它再次顯示新消息。[[2,2,1] IndentationError:意外縮進應該怎麼做? –

1

一點點哈克,但適用於你的情況:

import ast 
from lxml import html 

text = """<text> 
    <item id="1"> 
     [ 
      [2, 2, 1] 
      [1, 0, 0] 
      [1, 0, 0] 

     ] 
    </item> 
</text>""" 

tree = html.fromstring(text) 
data = ast.literal_eval(''.join([x.strip() for x in tree.xpath('//text/item[@id="1"]/text()')[0].replace('\n', '').replace(']','],').strip() if x.strip() !=""]).strip())[0] 

print type(data) 
print data 

輸出:

<type 'list'> 
[[2, 2, 1], [1, 0, 0], [1, 0, 0]] 
+0

我嘗試使用這種方式。它顯示「IndexError:列表索引超出範圍」。當我從XML讀取數據時,它沒有標籤()。我應該改變什麼? –

+0

@HimYikTang然後編輯你的問題,並提供一個很好的XML文件內容示例 –

0

你可以只使用映射到Unicode轉換爲字符串:

new_list = map(str, old_list)