Есть ли способ вернуть значение для тега из XML на основе указанного пути c в python? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть это XML

    <Body>
    <Batch_Number>2000</Batch_Number>
    <Total_No_Of_Batches>12312</Total_No_Of_Batches>
    <requestNo>1923</requestNo>
    <Parent1>
        <Parent2>
            <Parent3>
                    <lastModifiedDateTime>2022-11-11T11:07:30.000</lastModifiedDateTime>
                    <purpose>NeverMore</purpose>
                    <endDate>9999-12-31T00:00:00.000</endDate>
                    <createdDateTime>2019-06-06T06:32:16.000</createdDateTime>
                    <createdOn>2019-06-06T08:32:16.000</createdOn>
                    <address2>Forever street 21</address2>
                    <externalCode>code123</externalCode>
                    <lastModifiedBy>user2.thisUser</lastModifiedBy>
                    <lastModifiedOn>2039-06-11T13:07:30.000</lastModifiedOn>
                    <lastModifiedBy>MG</lastModifiedBy>
                    <PS>1234431</PS>
            </Parent3>
        </Parent2>
    </Parent1>
</Body>

Есть ли способ вернуть значение для lastModifiedBy, например, где путь имеет указанную структуру c:

Body.Parent1.Parent2.Parent3.lastModifiedBy

В идеале я хотел бы заполнить словарь именем дочернего тега и его значением, например:

dict[lastModifiedBy.tag] = lastModifiedBy.text

1 Ответ

0 голосов
/ 15 апреля 2020

Вы можете использовать xml из стандартной библиотеки для работы с xml файлами.

from xml.etree import ElementTree as ET

tree = ET.parse("d.xml") # our xml file
root = tree.getroot()

И затем вы можете получить доступ к элементам как индексам или использовать root как список:

for i in root:
    print(i)

Элемент XML может иметь более одного дочернего элемента с одинаковым именем тега (даже у вас есть два lastModifiedBy в Parent3). Вот почему мы используем их как списки, они работают как список. Таким образом, вы не должны пытаться использовать их как словарь.

Я думаю, вам нужно использовать XPath . Вот так:

from xml.etree import ElementTree as ET

tree = ET.parse("d.xml") # our xml file
root = tree.getroot()


s = root.findall(".Parent1/Parent2/Parent3/lastModifiedBy")

for i in s:
    print(i.text)

Это дает вам все lastModifiedBy элементов в элементе Parent3. Вы также можете получить доступ к любому индексу, например так:

from xml.etree import ElementTree as ET

tree = ET.parse("d.xml") # our xml file
root = tree.getroot()


s = root.find(".Parent1/Parent2/Parent3/lastModifiedBy[1]") # first element with "lastModifiedBy" tag

print(s.text)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...