Python и ElementTree: возвратите “внутренний XML”, исключая родительский элемент

В использовании Python 2.6 ElementTree, что является хорошим способом выбрать XML (как строка) в конкретном элементе, как то, с чем можно сделать в HTML и JavaScript innerHTML?

Вот упрощенный образец узла XML, с которого я запускаю:


Я хотел бы закончить с этой строкой:

This is some text and a link in embedded HTML

Я попытался выполнить итерации по родительскому узлу и конкатенировать tostring() из детей, но это дало мне только подузлы:

# returns only subnodes (e.g. and a link)
''.join([et.tostring(sub, encoding="utf-8") for sub in node])

Я могу изрубить решение с помощью регулярных выражений, но надеялся, что будет что-то меньше hacky, чем это:

re.sub("\s*?$", "", re.sub("^\s*?<\w*?>", "", et.tostring(node, encoding="utf-8")))

13
задан Justin Grant 9 August 2010 в 20:45
поделиться

2 ответа

Как насчет:

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 />
11
ответ дан 2 December 2019 в 00:02
поделиться

У меня сработало следующее:

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 или '' используется для получения текста в начале корневого элемента. Если текста нет, dom.text становится None.

Обратите внимание, что результат не является корректным XML - корректный XML должен иметь только один корневой элемент.

Посмотрите в документации ElementTree о смешанном содержимом.


Использование Python 2.6.5, Ubuntu 10.04

1
ответ дан 2 December 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: