访问python中的所有xml值,其中有几个具有相同的名称

时间:2013-07-12 16:19:29

标签: python xml

在我的应用程序中,我收到来自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作者;打印作者”,这很好。在这里,这个解决方案是我刚写的第二个,并没有给出预期的结果! 知道如何逐个访问作者的名字吗?谢谢!

3 个答案:

答案 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路径。

非常感谢!