【问题标题】:python parse xml and get attributes values for each subelement under rootpython解析xml并获取root下每个子元素的属性值
【发布时间】:2018-06-06 22:13:17
【问题描述】:

我正在使用 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>

我想通过标签“名称”检索与每个用户关联的组名 这在 python 中可行吗?

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

一个

一个

B

C

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

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

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

【问题讨论】:

    标签: xml python-2.7 parsing lxml


    【解决方案1】:

    欢迎来到 StackOverflow!专业提示:包含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']}
    

    【讨论】:

    • 谢谢!太好了,我也找到了另一种方法,但是使用 lxml 更简单
    猜你喜欢
    • 2012-04-03
    • 2012-04-14
    • 2023-04-08
    • 1970-01-01
    • 2019-10-12
    • 2021-08-26
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多