我正在尝试在python的xml.etree.ElementTreeElementTreeElement创建一个小的插件,该插件可以使用如下符号:

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.parseET.fromstringET.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__情况下是否可行?

相关: 如何在python中继承ElementTree.Element类?

===============>>#1 票数:1 已采纳

由于导入了Element和XMLParser的C实现,因此无法覆盖该类:

# 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')

===============>>#2 票数:1

我遇到了类似的问题,但偶然发现了一个快速的解决方法:
我在python 3.7之前的版本中导入了xmlschema ,并且没有问题用setattr猴子ET.Element

编辑:由于这很有趣,因此我对此进行了进一步研究。 这是猴子补丁ElementTree的方法

  ask by arve0 translate from so

未解决问题?本站智能推荐:

1回复

Python xml.etree.ElementTree目录访问

我想要做的是使用xml.etree.elementtree的函数xml.etree.elementtree与.py不在同一文件夹中的XML文件 它不断给出错误: 我一直觉得自己在编写路径时做错了什么...但是我找不到在线示例来了解它应该如何工作
1回复

我如何使用QName(python xml.etree.ElementTree?)

我已经对QName做了相当多的阅读,但我找不到任何关于如何使用它的好例子。 有人能给我一个简单的例子来说明如何使用QName并解释它将用于什么上下文?
1回复

从python中的etree中删除元素同级

我试图删除给定元素的所有兄弟姐妹: 例如,给定此etree对象 我想删除所有G节点的兄弟姐妹并返回: 无需使用xpath或find,而是采用迭代方式。 您能给一些技巧吗? 这是我刚写的代码 干杯!
2回复

在标签上解析带有前缀的.xml? xml.etree.ElementTree

我可以读取标签,除非有前缀。 我没有运气搜索SO以前的问题。 我需要阅读media:content 。 我试过image = node.find("media:content") 。 Rss输入: 我可以读一个兄弟标签title 。 我一直在使用文档,但仍然坚持'前缀
1回复

使用python etree打印xml的嵌套元素

我正在尝试构建一个脚本来读取xml文件。 这是我第一次解析xml,我正在将python与xml.etree.ElementTree一起使用。 我要处理的文件部分如下所示: 可以从以下位置下载完整文件: https://dailymed.nlm.nih.gov/dailymed/
1回复

.set()方法不在Python的xml.etree库中吗?

使用Python创建带有某些数据的XML文件的工作。 我正在尝试将字典中的值设置为列表中的数据。 我将要写多行,所以这就是为什么我以这种方式引用每个值的原因。 多谢你们。 这是我的代码: 虽然在文档中清楚地显示了它... http://docs.python.org/lib
1回复

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

我正在使用xml.etree.ElementTree解析XML文件。 我该如何强制它去掉空白文本(只是常规空格,而不是&#32; )或留出空格而忽略转义符(将它们保留原样)? 这是我的问题: 它打印: 我需要的: 或(我可以通过其他方式逃脱): 使用x
1回复

如何在python etree中正确地转义XML?

我正在使用python版本2.7.3。 test.txt: 结果: 如您所见,解析器必须更改了&lt; 到<的等 我想看的是: The tag &lt;StackOverflow&gt; is good to bring up at
1回复

为什么xml.etree.ElementTree.parse转换小写的命名空间元素

我想指示ET.parse保留XML中的命名空间大小写 原始文件如下所示:
1回复

如何使用xml.etree.ElementTree访问标签之间的文本

我正在尝试使用xml.etree.ElementTree提取XML文档的两个标签之间的文本值。 在以下示例中,该值为text two和text three 。 我只能提取一个text one 。 如何从<c>标记中找到其他文本?