2017-01-27 7 views
4

У меня есть (старый) инструмент, который не понимает самозакрывающиеся теги, например <STATUS/>. Итак, нам нужно сериализовать наши XML-файлы с открытыми/закрытыми тегами следующим образом: <STATUS></STATUS>.Сохранить lxml от создания самозакрывающихся тегов

В настоящее время у меня есть:

>>> from lxml import etree 

>>> para = """<ERROR>The status is <STATUS></STATUS>.</ERROR>""" 
>>> tree = etree.XML(para) 
>>> etree.tostring(tree) 
'<ERROR>The status is <STATUS/>.</ERROR>' 

Как я могу сериализовать с открытыми/закрытыми тегами?

<ERROR>The status is <STATUS></STATUS>.</ERROR> 

Решение

Предоставлено wildwilhelm, below:

>>> from lxml import etree 

>>> para = """<ERROR>The status is <STATUS></STATUS>.</ERROR>""" 
>>> tree = etree.XML(para) 
>>> for status_elem in tree.xpath("//STATUS[string() = '']"): 
...  status_elem.text = "" 
>>> etree.tostring(tree) 
'<ERROR>The status is <STATUS></STATUS>.</ERROR>' 

ответ

3

Похоже, что <STATUS> тег получает присваивается атрибут text из None:

>>> tree[0] 
<Element STATUS at 0x11708d4d0> 
>>> tree[0].text 
>>> tree[0].text is None 
True 

Если установить атрибут тега <STATUS>text в пустую строку, вы должны получить то, что вы ищете:

>>> tree[0].text = '' 
>>> etree.tostring(tree) 
'<ERROR>The status is <STATUS></STATUS>.</ERROR>' 

С это умом, вы, вероятно, можете идти DOM дерево и исправить text перед записью вашего XML. Что-то вроде этого:

# prevent creation of self-closing tags 
for node in tree.iter(): 
    if node.text is None: 
     node.text = '' 
+0

Я помню этот трюк, спасибо. Я обновляю свой вопрос ... –