2015-11-26 69 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)