python анализирует xml и получает значения атрибутов для каждого подэлемента под root - PullRequest
0 голосов
/ 07 июня 2018

Я использую 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>

Я хочуполучить имена групп, связанных с каждым пользователем, по тегу «Имя». Возможно ли это в python?

Когда я использую lxml xpath для GroupName, я просто получаю список GroupNames, подобный следующему:

A

A

B

C

, поэтому нет способа узнать, какие группы связаны с каким пользователем

Если я могукак-то отличить это, может быть, я могу создать словарь с ключом в качестве пользователя и значениями в качестве групп, но я не уверен, как

Это мой первый пост, чтобы переполнить стек, я прошу прощения, если я что-то пропустилили не предоставил всю необходимую информацию

1 Ответ

0 голосов
/ 07 июня 2018

Добро пожаловать в StackOverflow!Подсказка: полезно включить Минимальный, Полный и Проверяемый пример .Вы были частично там;нам просто нужен был код и желаемый вывод.

Я думаю, что вы пытаетесь получить текстовые узлы элементов Name и GroupName.На самом деле у вас нет никаких атрибутов в вашем 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']}
...