Использование BeautifulSoup для заполнения (и идентификации) пустых тегов xml - PullRequest
0 голосов
/ 18 января 2020

Заполнение пустых тегов XML - это не то, для чего я могу легко найти подходящее решение.

Допустим, мы получаем фрагмент XML, подобный следующему, содержащий информацию о клиенте:

<TransactionDetails>
    <Name>Jamie Silver</Name>
    <CustomerID>1234567</CustomerID>
    <StaffID>9876543</StaffID>
</TransactionDetails>

Иногда фрагмент, который мы получаем, может не иметь StaffID того, кто их обслуживал. В этом случае фрагмент XML показывает тег StaffID очень по-разному:

<TransactionDetails>
    <Name>Jamie Silver</Name>
    <CustomerID>1234567</CustomerID>
    <StaffID/>
</TransactionDetails>

Так что, когда StaffID отсутствует, <StaffID></StaffID> усекается до <StaffID/>, где передний сл sh перемещается назад.

Я пытаюсь вставить заполненное значение в файл XML с помощью BeautifulSoup, но также необходимо исправить неправильное усечение (чтобы <StaffID/> снова превратилось в <StaffID></StaffID> первый.

1 Ответ

1 голос
/ 18 января 2020
Селекторы

CSS обычно используются с HTML, но многие прекрасно работают с XML. Поскольку вы используете XML, мы будем использовать синтаксический анализатор lxml-xml. И мы будем использовать селектор :empty. Пока элемент не имеет дочерних элементов и содержит только пробелы, это будет работать для нас. При этом используется определение css -selector-4 :empty: https://drafts.csswg.org/selectors-4/#the -empty-pseudo .

В приведенном ниже примере цели StaffID пусты. Тогда мы заменим .string на 0000000. Поскольку существует только один экземпляр пустого элемента, только этот изменится.

from bs4 import BeautifulSoup

XML = """
<root>
<TransactionDetails>
    <Name>Jamie Silver</Name>
    <CustomerID>1234567</CustomerID>
    <StaffID/>
</TransactionDetails>
<TransactionDetails>
    <Name>Jamie Silver</Name>
    <CustomerID>1234567</CustomerID>
    <StaffID>9876543</StaffID>
</TransactionDetails>
</root>
"""

soup = BeautifulSoup (XML, 'lxml-xml')
els = soup.select('StaffID:empty')

for el in els:
    el.string = "0000000"

print(soup)

Вывод:

<?xml version="1.0" encoding="utf-8"?>                                                                                                                      
<root>                                                                                                                                                      
<TransactionDetails>                                                                                                                                        
<Name>Jamie Silver</Name>                                                                                                                                   
<CustomerID>1234567</CustomerID>                                                                                                                            
<StaffID>0000000</StaffID>                                                                                                                                  
</TransactionDetails>                                                                                                                                       
<TransactionDetails>                                                                                                                                        
<Name>Jamie Silver</Name>                                                                                                                                   
<CustomerID>1234567</CustomerID>                                                                                                                            
<StaffID>9876543</StaffID>                                                                                                                                  
</TransactionDetails>                                                                                                                                       
</root>

Надеюсь, это поможет.

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