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

  • 相关阅读:
    让你的网站在移动端健步如飞
    select元素javascript常用操作 转
    网站CSS写在html里面的好处
    Javascript 严格模式详解
    mac下网页中文字体优化
    js作用域相关知识总结
    【待填坑】 undefined和not defined的区别
    【待填坑】js构造函数和内置对象的区别
    echarts入门1【柱状图/饼图】
    echarts在miniUI和ajax下动态渲染数据
  • 原文地址:https://www.cnblogs.com/qq78292959/p/3501496.html
Copyright © 2011-2022 走看看