zoukankan      html  css  js  c++  java
  • 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))
    ...
    >>>

  • 相关阅读:
    怎样修改原型对象prototype
    怎样获取构造函数的名字
    怎样把实例对象当构造函数用
    怎样理解prototype对象的constructor属性
    怎样理解构造函数的原型对象prototype
    怎样给回调函数绑定this
    怎样绑定this
    怎样理解数组的空元素empty与undefined的区别
    怎样找出数组中的最大数值
    怎样调用对象的原生方法
  • 原文地址:https://www.cnblogs.com/qq78292959/p/3501496.html
Copyright © 2011-2022 走看看