代码之家  ›  专栏  ›  技术社区  ›  Justin Grant

python和elementtree:返回“inner xml”,不包括父元素

  •  12
  • Justin Grant  · 技术社区  · 14 年前

    在使用elementtree的python 2.6中,在一个特定元素中提取XML(作为字符串)的一个好方法是什么,就像在HTML和javascript中可以使用 innerHTML ?

    下面是我从以下内容开始的XML节点的简化示例:

    <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
    

    我尝试在父节点上迭代并连接 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")))
    
    3 回复  |  直到 5 年前
        1
  •  10
  •   Mark Tolonen    14 年前

    怎么样:

    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
  •  1
  •   Emil Ivanov    14 年前

    以下内容对我很有用:

    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 None .

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

    看看 ElementTree docs about mixed content .


    使用python 2.6.5,Ubuntu 10.04

        3
  •  1
  •   fluffy    5 年前

    这是基于其他解决方案,但其他解决方案在我的情况下不起作用(导致异常),而此解决方案起作用:

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

    使用方法与 Mark Tolonen's answer .