1

在我的应用程序中,我以 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 下,我做了“foreach author in xml['...']['Author']; print author”,效果很好。在这里,这个解决方案是我刚刚写的第二个,它没有给出预期的结果!知道如何一一访问作者的姓名吗?谢谢 !

4

3 回答 3

1

这是您正在使用的simplexml库吗?它自 2005 年以来一直没有更新(http://freecode.com/projects/simplexml)。

由于我在 PyPI 页面和项目页面上都没有看到该库的任何文档,因此我对此无能为力。

您的代码输出表明您迭代了一个字符串。

但是,我可以推荐在标准库中使用ElementTree 。它易于使用,目前受支持,而且我知道它提供子元素作为列表,而不管元素标记的唯一性(或不唯一性)。

于 2013-07-12T17:02:55.243 回答
0

实际上,似乎 lxml.objectify 解决方案是最好的。它允许在 xml 中查找您知道的路径。另外,我没有说你(对不起),但是 xml 比我之前解释的要复杂和深刻得多。它不是以 ItemAttributes -> authors 开头的。

还有更多:

项目(xml 中还有其他节点)-> 项目(我发现每本书一个项目!)-> ItemAttributes -> ...</p>

使用 lxml.objectify,我可以找到我需要的任何东西。唯一的难点是解决一个常见问题,即当标签或值不存在时,一切都崩溃了。我只是使用 try :

try:
    dico["title"] = unicode(xml.Items.Item.ItemAttributes.Title)
except AttributeError:
    dico["title"] = ''

而已 !上面的代码向您展示了我如何使用 xml 路径。

不管怎么说,还是要谢谢你 !

于 2013-07-21T21:57:48.887 回答
0

Here's a working example using 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

I hope this helps.

Thank you.

于 2013-07-12T17:25:02.650 回答