Python和ElementTree:return;“内部XML”;排除父元素

Python和ElementTree:return;“内部XML”;排除父元素,python,xml,elementtree,Python,Xml,Elementtree,在使用ElementTree的Python2.6中,获取特定元素中的XML(作为字符串)的好方法是什么,比如在HTML和javascript中可以使用什么 下面是我开始使用的XML节点的简化示例: <label attr="foo" attr2="bar">This is some text <a href="foo.htm">and a link</a> in embedded HTML</label> 我可以用正则表达式构建一个解决方案,但我

在使用ElementTree的Python2.6中,获取特定元素中的XML(作为字符串)的好方法是什么,比如在HTML和javascript中可以使用什么

下面是我开始使用的XML节点的简化示例:

<label attr="foo" attr2="bar">This is some text <a href="foo.htm">and a link</a> in embedded HTML</label>
我可以用正则表达式构建一个解决方案,但我希望有比这更简单的解决方案:

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

以下几点对我很有用:

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'
从xml.etree导入元素树作为etree
xml='此处开始一些文本此处和此处以及此处结束'
dom=etree.XML(XML)
(dom.text或“”)+“”.join(map(etree.tostring,dom))+(dom.tail或“”)
#'此处开始一些文本此处和此处以及此处结束'
dom.text或“
用于获取
根元素开头的文本。如果没有文本
dom,则text
None

请注意,结果不是有效的XML-有效的XML应该只有一个根元素

看一看这张照片


使用Python2.6.5、Ubuntu 10.04如何:

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'))
从xml.etree导入ElementTree作为ET
xml='此处开始一些文本此处和此处以及此处结束'
root=ET.fromstring(xml)
def内容(标签):
return tag.text+''.join(ET.tostring(e)表示标记中的e)
打印内容(根目录)
打印内容(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 />
此处开始一些文本此处和此处以及此处结束
这里也是

这是基于其他解决方案的,但其他解决方案在我的案例中不起作用(导致异常),而这一个有效:

from xml.etree import Element, ElementTree

def inner_xml(element: Element):
    return (element.text or '') + ''.join(ElementTree.tostring(e, 'unicode') for e in element)

使用方法与中相同。

hi Emil-如果所有文本都在子元素内,则解决方案工作正常,但在我的情况下,如果文本直接在父元素内,则会中断。您关于混合内容的说明显然适用于这里,尽管我不确定(目前)如何将head、tail和subelement组合在一起以发出连贯的字符串。。。但是etree.tostring()不包括每个子元素的尾部。我认为最后的dom.tail是不需要的,因为它是元素后面的字符串,而不是在它里面。我似乎不理解你Justin-
从这里开始
在这里结束
是根元素里面的文本吗?!上面的代码段可能需要一些修改-您可以创建一些测试用例并对其进行改进-请参阅有关如何处理混合内容的文档链接;有关与Python 3兼容的答案,请参见下面@JustAC0der的答案。
start here<child1>some text<sub1 />here</child1>and<child2>here as well<sub2 /><sub3 /></child2>end here
here as well<sub2 /><sub3 />
from xml.etree import Element, ElementTree

def inner_xml(element: Element):
    return (element.text or '') + ''.join(ElementTree.tostring(e, 'unicode') for e in element)