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

  • 相关阅读:
    一个案例
    Python Qt 简介
    【第二】用QtDesigner设计第一个界面
    【第一节】QtDesigner安装
    【第十二节】PyQt5俄罗斯方块
    【第十一节】PyQt5自定义控件
    【第十节】PyQt5绘图
    【第九节】PyQt 拖拽
    【第八节】PyQt5控件(II)
    【第七节】PyQt5控件
  • 原文地址:https://www.cnblogs.com/qq78292959/p/3501496.html
Copyright © 2011-2022 走看看