Python и ElementTree: возвращает "внутренний XML", исключая родительский элемент
В Python 2.6, используя ElementTree, какой хороший способ получить XML (как строку) внутри определенного элемента, например, что вы можете делать в HTML и javascript с помощью innerHTML
?
Здесь упрощенный образец XML node Я начинаю с:
<label attr="foo" attr2="bar">This is some text <a href="foo.htm">and a link</a> in embedded HTML</label>
Я хотел бы получить эту строку:
This is some text <a href="foo.htm">and a link</a> in embedded HTML
Я попытался выполнить итерацию над родительским node и конкатенировать tostring()
дочерних элементов, но это дало мне только подузлы:
# returns only subnodes (e.g. <a href="foo.htm">and a link</a>)
''.join([et.tostring(sub, encoding="utf-8") for sub in node])
Я могу взломать решение, используя регулярные выражения, но надеялся, что будет что-то менее хакерское, чем это:
re.sub("</\w+?>\s*?$", "", re.sub("^\s*?<\w*?>", "", et.tostring(node, encoding="utf-8")))
Ответы
Ответ 1
Как насчет:
from xml.etree import ElementTree as ET
xml = '<root>start here<child1>some text<sub1/>here</child1>and<child2>here as well<sub2/><sub3/></child2>end here</root>'
root = ET.fromstring(xml)
def content(tag):
return tag.text + ''.join(ET.tostring(e) for e in tag)
print content(root)
print content(root.find('child2'))
Результат:
start here<child1>some text<sub1 />here</child1>and<child2>here as well<sub2 /><sub3 /></child2>end here
here as well<sub2 /><sub3 />
Ответ 2
Следующие работали для меня:
from xml.etree import ElementTree as etree
xml = '<root>start here<child1>some text<sub1/>here</child1>and<child2>here as well<sub2/><sub3/></child2>end here</root>'
dom = etree.XML(xml)
(dom.text or '') + ''.join(map(etree.tostring, dom)) + (dom.tail or '')
# 'start here<child1>some text<sub1 />here</child1>and<child2>here as well<sub2 /><sub3 /></child2>end here'
dom.text or ''
используется для получения текста в начале элемента root
. Если нет текста dom.text
is None
.
Обратите внимание, что результат не является допустимым XML - допустимый XML должен иметь только один корневой элемент.
Посмотрите Документы ElementTree о смешанном контенте.
Использование Python 2.6.5, Ubuntu 10.04