python - 继承或模拟 pythons etree.ElementTree.Element 可能吗?

标签 python xml xml.etree

我正在尝试为 ElementTree 创建一个小插件和Element在Python的xml.etree.ElementTree这将允许这样的符号:

root = ET.fromstring('<root><a><b attr1="2"/></a></root>')
element1 = root.a
element2 = root.a.b
attr = root.a.b.attr

我已经尝试过这个:

import xml.etree.ElementTree as _ET

def __getattr__(self, key):
    return self.find('./' + key)

class ElementTree(_ET.ElementTree):
    __getattr__ = __getattr__


class Element(_ET.Element):
    __getattr__ = __getattr__

但这不起作用,因为 ET.parse , ET.fromstring , ET.ElementTree.find等将始终返回内部 ElementElementTree对象。

Monkeypatching 类也不起作用:

>>> xml.etree.ElementTree.Element.__getattr__ = lambda x: x
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-bacb0a64c2e5> in <module>()
----> 1 xml.etree.ElementTree.Element.__getattr__ = lambda x: x

TypeError: can't set attributes of built-in/extension type 'xml.etree.ElementTree.Element'

如果不复制 python etree 模块然后添加 __getattr__ 是否可行? ?

相关:How to inherit ElementTree.Element class in python?

最佳答案

由于import of the Element and XMLParser's C implementation,无法覆盖该类:

# Import the C accelerators
try:
    # Element is going to be shadowed by the C implementation. We need to keep
    # the Python version of it accessible for some "creative" by external code
    # (see tests)
    _Element_Py = Element

    # Element, SubElement, ParseError, TreeBuilder, XMLParser
    from _elementtree import *
except ImportError:
    pass

模块_elementtree位于 Modules/_elementtree.c .

解决方案是复制 python etree 模块,并将导入更改为:

_Element_Py = Element

我做了一个简单的实现:https://github.com/arve0/objectifiedetree

像这样使用:

from objectifiedetree import *

tree = ET.parse('/path/to/file.xml')
# dot notation :-)
el = tree.xpath.to.your.element

# use normal etree attributes
print(el.attrib)

# access name crashes
attrib_el = el.find('./attrib')

关于python - 继承或模拟 pythons etree.ElementTree.Element 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30278551/

相关文章:

Python 3 XML xml.etree 解析标准输出 bash cli 命令

python - 点击cherrypy中的链接提交表单

python - Flask App 进行多次登录尝试的奇怪行为

python 名称错误 : name 'file' is not defined in python 3. 5

java - 抽屉导航项目图标未显示原始颜色

python - 使用 xml.etree.ElementTree (python) 解析 XML 时,如何区分常规空格和转义空格 ()

python - 如何在 Elastic Beanstalk 上启动时运行一次 python 脚本

c# - 在现有 XML 中插入新的子节点

c# - 如何从 XML 文件中删除空格

python-3.x - xml.etree.ElementTree.iterparse() 对于大型 XML 文档不可扩展?