2016-11-16 2 views
1

У меня есть XML в локальном файле, который является шаблоном для окончательного сообщения, которое получает POST ed в службу REST. Сценарий предварительно обрабатывает данные шаблона до его публикации.Как заменить/удалить XML-тег с помощью BeautifulSoup?

Так что шаблон выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
    <singleElement> 
     <subElementX>XYZ</subElementX> 
    </singleElement> 
    <repeatingElement id="11" name="Joe"/> 
    <repeatingElement id="12" name="Mary"/> 
</root> 

сообщение XML должен выглядеть такой же, за исключением того, что repeatingElement теги должны быть заменены чем-то другим (XML генерируется с помощью сценария на основе атрибутов в существующий тег).

Вот мой сценарий до сих пор:

xmlData = None 

with open('conf//test1.xml', 'r') as xmlFile: 
    xmlData = xmlFile.read() 

xmlSoup = BeautifulSoup(xmlData, 'html.parser') 

repElemList = xmlSoup.find_all('repeatingelement') 

for repElem in repElemList: 
    print("Processing repElem...") 
    repElemID = repElem.get('id') 
    repElemName = repElem.get('name') 

    # now I do something with repElemID and repElemName 
    # and no longer need it. I would like to replace it with <somenewtag/> 
    # and dump what is in the soup object back into a string. 
    # is it possible with BeautifulSoup? 

Могу ли я заменить повторяющиеся элементы с чем-то другим, а затем сбросить объект суп в новую строку, я могу отправлять сообщения в REST API?

Примечание: Я использую html.parser, потому что я can't get the xml parser to work, но это работает хорошо, понимание HTML является более снисходительным, чем XML разбор.

ответ

1

Вы можете использовать .replace_with() и .new_tag() методы:

for repElem in repElemList: 
    print("Processing repElem...") 
    repElemID = repElem.get('id') 
    repElemName = repElem.get('name') 

    repElem.replace_with(xmlSoup.new_tag("somenewtag")) 

Затем вы можете сбросить "суп" с помощью str(soup) или soup.prettify().

+0

смешно, я просто придумал одно и то же решение – amphibient

+0

К сожалению, единственным парсером супа, который работает в моей системе (Win7), является 'html.parser' (xml не работает согласно http://stackoverflow.com/ Вопросы/40640026/how-to-install-module-for-beautifulsoup-xml-parsing? noredirect = 1 # comment68512605_40640026) преобразует все теги в нижний регистр, а мой REST API чувствителен к регистру – amphibient

Смежные вопросы