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

python parse xml and get attributes values for each subelement under root

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

这是我的示例 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>

我想通过标签检索与每个用户关联的组名 "Name" 这在 python 中可能吗?

当我对 GroupName 使用 lxml xpath 时,我只得到如下所示的 GroupNames 列表:

一个

一个

B

C

因此无法查看哪些组关联了哪些用户

如果我能以某种方式区分这一点,也许我可以构建一个字典,其中键作为用户,值作为组,但我不确定如何

这是我第一次 post 堆栈溢出,如果我遗漏了什么或没有提供所有需要的信息,我深表歉意

欢迎使用 Whosebug!专业提示:包含一个 Minimal, Complete, and Verifiable example 会很有帮助。你部分地在那里;我们只需要代码和所需的输出。

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

我会做的是 select 每个 User,然后使用 Name 在包含列表的字典中创建一个项目。然后您可以 select 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']}