python解析xml并获取root下每个子元素的属性值

时间:2018-06-06 22:13:17

标签: xml python-2.7 parsing lxml

我使用xpath搜索attirbutes,但我不确定如何获取root下每个子元素的属性

这是我的示例xml文件

<User>
  <Name>abcd</Name>
  <Groups>
     <GroupName>A</GroupName>
     <groupName>B</GroupName>
  </Groups>
</User>
<User>
  <Name>zxcv</Name>
  <Groups>
     <GroupName>A</GroupName>
     <GroupName>C</GroupName>
  </Groups>
</User>

我想通过标记&#34; Name&#34;检索与每个用户关联的组名。 这在python中是否可行?

当我使用lxml xpath for GroupName时,我只会得到一个GroupNames列表,如下所示:

A

A

C

因此无法查看哪些组与哪个用户相关联

如果我可以以某种方式区分这个,也许我可以用关键字作为用户构建字典,并将值作为组,但我不知道如何

这是我第一篇关于堆栈溢出的帖子,如果我错过了某些内容或者没有提供所有必需的信息,我道歉

1 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow! ProTip:包含Minimal, Complete, and Verifiable example很有帮助。你部分在那里;我们只需要代码和所需的输出。

我认为您要获得的是NameGroupName元素的文本节点。实际上,XML中没有任何属性。 (使用正确的术语将帮助您避免很多混淆。也许看看https://www.w3.org/TR/xml11/

我要做的是选择每个User,然后使用Name在字典中创建包含列表的项目。然后,您可以选择GroupName元素,并将其添加到当前User的列表中。

示例...

from lxml import etree

# Added "doc" root element to make the XML well-formed.
xml = """
<doc>
    <User>
        <Name>abcd</Name>
        <Groups>
            <GroupName>A</GroupName>
            <GroupName>B</GroupName>
        </Groups>
    </User>
    <User>
        <Name>zxcv</Name>
        <Groups>
            <GroupName>A</GroupName>
            <GroupName>C</GroupName>
        </Groups>
    </User>
</doc>
"""

tree = etree.fromstring(xml)

users = {}
for user in tree.xpath("//User"):
    name = user.xpath("Name")[0].text
    users[name] = []
    for group in user.xpath("Groups/GroupName"):
        users[name].append(group.text)

print users

这将输出(打印)......

{'abcd': ['A', 'B'], 'zxcv': ['A', 'C']}