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

  • 相关阅读:
    【Angular】笔记(2):从前端基本知识认识Angular
    【Angular】笔记(1):使用.NET Framework类比认识Angular
    【C#】笔记(2):哈希表
    【WinForm】杂记(6):C#之DataTable类(总结)
    【C#】笔记(1):科学计算
    【WinForm】杂记(5):C#导入Excel到DataTable
    【WinForm】杂记(4):C#编写和调用exe程序(带参数)
    从mixin到new和prototype:Javascript原型机制详解
    亲身体验函数的柯里化
    简单理解jsonp原理
  • 原文地址:https://www.cnblogs.com/qq78292959/p/3501496.html
Copyright © 2011-2022 走看看