• Accessing an element's parent with ElementTree(转)


    Today I ran across a situation where I needed to programmatically remove specific elements from a KML file. I was already using Python's ElementTree library for my KML processing, so I attempted to use ElementTree's remove() method. The remove() method can only remove subelements, requiring access to the undesired element's parent.

    No problem, right? Even though there isn't a parent attribute or getparent() method for elements, ElementTree 1.3 introduced an XPath expression to get an element's parent.

    Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
    [GCC 4.6.1] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import xml.etree.ElementTree as et
    >>> et.VERSION
    '1.3.0'
    >>> tree = et.parse('test.kml')
    >>> xmlns = '{http://www.opengis.net/kml/2.2}'
    >>> elem = tree.find('.//%scolorMode' % xmlns)
    >>> elem
    <Element '{http://www.opengis.net/kml/2.2}colorMode' at 0x7f4bfc04a650>
    >>>
    >>> elem.find('..')
    >>>

    Turns out, that's not how things work in the world of ElementTree. An element actually has no reference back to its parent, thus explaining the lack of a getparent() type method for the element...and why elem.find('..') returns None.

    There are a couple different solutions at this point. You can create a generator that will iterate over your tree, returning (parent, child) tuples (detailed here) or use lxml, which is ElementTree compliant and supports a getparent() method for elements.

    However, if you're like me, you'll feel an inability to move on until you figure out why the XPath isn't working like you think it should. You might be tempted to think that something is broken with ElementTree, but, as is almost always the case, the problem is a user error.

    It actually took a fair amount of thinking and a suggestion from my good friend Ryan to figure this out. Basically, since the element doesn't contain a reference to its parent, we need to go up a level (to the tree) in order to get the parent node using the '..' XPath expression.

    >>> tree.find('.//%scolorMode/..' % xmlns)
    <Element '{http://www.opengis.net/kml/2.2}LineStyle' at 0x7f4bfc04a490>

    Now you have the parent element, so removing the undesired child element (colorMode, in this case) is relatively simple.

    >>> parents = tree.findall('.//%scolorMode/..' % xmlns)
    >>>
    >>> for parent in parents:
    ...         parent.remove(parent.find('%scolorMode' % xmlns))
    ...
    >>>

  • 相关阅读:
    combination sum II
    Combination sum
    Swap Nodes in Pairs(交换节点)
    4 sum
    3 sum closest
    五大常用算法:分治、动态规划、贪心、回溯和分支界定
    3sum(从数组中找出三个数的和为0)
    从系统相册选择照片时,没有选框,相册无选框
    iOS Xcode 调试技巧 全局断点这样加才有意思
    将任意对象存进数据库
  • 原文地址:https://www.cnblogs.com/qq78292959/p/3501496.html
Copyright © 2020-2023  润新知