Работа с условиями атрибутов в XML и Python - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь изменить XML с помощью Python.

По сути, я хотел бы взглянуть на атрибут «условие» элементов и на основе этого удалить / сохранить элементы в моем XML. Мне также нужно, чтобы мой код понимал, когда в атрибуте есть условие «не» или «или» (не уверен, возможно ли это с помощью python и lxml).

В моем примере XML ниже я хотел бы запросить, что если атрибут условие = 1, он удалит все другие элементы, кроме того элемента, который содержит условие = "1". И он должен удалять только те элементы, которые на самом деле имеют атрибут условия, поэтому элемент title должен оставаться, потому что у него вообще нет атрибута условия.

Оригинальный XML:

<book>

    <chapter id="hi" condition="2">Item 3</chapter>

    <chapter id="hi" condition="1 or 2">Item 3</chapter>

    <chapter id="hi" condition="1">Item 2</chapter>

    <title title="Test">Item 1</title>

</book>

Так что, если "условие" = 1 ->

Выходной XML (должен выглядеть так):

<book>

    <chapter id="hi" condition="1 or 2">Item 3</chapter>

    <chapter id="hi" condition="1">Item 2</chapter>

    <title title="Test">Item 1</title>

</book>

Я пытался использовать разные запросы xpath / lxml и т. Д., Просто не могу понять, как решить эту проблему, возможно ли вообще использовать Python?

Заранее спасибо!

1 Ответ

0 голосов
/ 20 июня 2019

Вы можете использовать BeautifulSoup .

. Используйте BeautifulSoup() для создания BeautifulSoup объекта из строковой версии входного XML.

from bs4 import BeautifulSoup
soup = BeautifulSoup(x, "xml")

Второй аргумент BeautifulSoup() определяет синтаксический анализатор.См. this .

Теперь давайте создадим переменную n, в которой будет найдено значение, которое в приведенном вами примере равно 1.

n = 1

Используйте find_all(), чтобы перебрать все теги, присутствующие в soup.

for t in soup.find_all():
    ....

Теперь используйте has_attr(), чтобы увидеть, есть ли у тега атрибут с именем 'condition'.

if t.has_attr('condition'):
    ....

Если такой атрибут существует, мы можем получить его значение с помощью t['condition'].Разделите полученную таким образом строку, чтобы получить из нее целые числа (предполагая, что это целое число, которое вы хотите), чтобы получить список операндов.if x.isdigit() используется для избавления от and, or и т. Д.

operand_list = [int(x) for x in t['condition'].split() if x.isdigit()]

Если n отсутствует в списке операндов, удалите тег из дерева XML с помощью decompose().

if n not in operand_list:
    t.decompose()

После окончания цикла напечатаем результирующий XML, отформатированный с использованием функции prettify():

print(soup.prettify())

Piecingвместе все части, окончательная программа будет

n = 1
for t in soup.find_all():
    if t.has_attr('condition'):
        operand_list = [int(x) for x in t['condition'].split() if x.isdigit()]
        if n not in operand_list:
            t.decompose()
print(soup.prettify())

Выход будет

<book>
 <chapter condition="1 or 2" id="hi">
  Item 3
 </chapter>
 <chapter condition="1" id="hi">
  Item 2
 </chapter>
 <title title="Test">
  Item 1
 </title>
</book>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...