在我的应用程序中,我收到来自amazon的xml信息。所以,我通过simplexml读取并访问这些值。
我的问题是当我想访问几个具有相同名称的邻居字符串时。 一个例子:
<ItemAttributes>
<Author>Brian Herbert</Author>
<Author>Kevin J Anderson</Author>
<Author>Frank Herbert</Author>
<Binding>Paperback</Binding>
<EAN>9782221088913</EAN>
我想要三个作者!弗兰克和布莱恩赫伯特,还有安德森。
以下是我发布每个命令时的结果:
>>> for cle in xml['ItemSearchResponse']['Items']['Item'][1]['ItemAttributes'].values():
... print cle
...
749782221088913
Robert Laffont
2221088913
9782221088913
Frank Herbert
{u'EANListElement': u'9782221088913'}
>>> for item in enumerate(xml['ItemSearchResponse']['Items']['Item'][1]['ItemAttributes']['Author']):
... print item
...
F
r
a
n
k
H
e
r
b
e
r
t
所以我只访问列表的最后一项,而有几个。我能怎么做 ? 在PHP下,我做了“在xml ['...'] ['作者']中的foreach作者;打印作者”,这很好。在这里,这个解决方案是我刚写的第二个,并没有给出预期的结果! 知道如何逐个访问作者的名字吗?谢谢!
答案 0 :(得分:1)
这是您正在使用的simplexml库吗?它自2005年以来一直没有更新(http://freecode.com/projects/simplexml)。
由于我在PyPI页面和项目页面上都没有看到该库的任何文档,因此我无法提供相应的帮助。
代码的输出表明你迭代了一个字符串。
但是,我建议在标准库中使用ElementTree。它很容易使用,目前支持,并且我知道它将子元素作为列表提供,而不管元素标记的唯一性(或不是)。
答案 1 :(得分:0)
以下是使用ElementTree的工作示例:
>>> import xml.etree.ElementTree as ET
>>> xml="""<ItemAttributes>
<Author>Brian Herbert</Author>
<Author>Kevin J Anderson</Author>
<Author>Frank Herbert</Author>
<Binding>Paperback</Binding>
<EAN>9782221088913</EAN>
</ItemAttributes>"""
>>> root = ET.fromstring(xml)
>>> for author in root.iter('Author'):
print author.text
Brian Herbert
Kevin J Anderson
Frank Herbert
我希望这会有所帮助。
谢谢。
答案 2 :(得分:0)
实际上,似乎lxml.objectify解决方案是最好的。 它允许在xml中找到你知道的路径。 另外,我没有说你(对不起),但xml比我之前解释的要复杂得多。 它不以ItemAttributes开头 - &gt;作者。
还有更多:
项目(xml中还有其他节点) - &gt;项目(我发现每本书一项!) - &gt; ItemAttributes - &gt; ...
使用lxml.objectify,我可以找到我需要的任何东西。唯一的难点是解决一个常见问题,即当标签或值不存在时,一切都崩溃了。 我只是使用try:
try:
dico["title"] = unicode(xml.Items.Item.ItemAttributes.Title)
except AttributeError:
dico["title"] = ''
就是这样! 上面的代码显示了我如何使用xml路径。
非常感谢!