首页  >  文章  >  后端开发  >  如何忽略 ElementTree 元素位置中的命名空间:一个简单的解决方案?

如何忽略 ElementTree 元素位置中的命名空间:一个简单的解决方案?

Linda Hamilton
Linda Hamilton原创
2024-10-28 05:10:02923浏览

How to Ignore Namespaces in ElementTree's Element Location: A Simple Solution?

忽略 ElementTree 元素位置中的命名空间

当使用 ElementTree 中的 findall 方法来定位命名空间感知的 XML 文档中的元素时,它变成需要为每个标签指定名称空间。这可能会带来不便。本文介绍了一种在 ElementTree 搜索方法(如 find 和 findall)中忽略命名空间的方法。

问题:

如提供的示例代码中所示,tree.findall(由于 XML 文件中忽略了命名空间,“DEAL_LEVEL/PAID_OFF”)调用返回 None。在每个标签中添加 {http://www.test.com} 是一个不方便的解决方法。

解决方案:

与其修改 XML 文档,不如解析它并操作结果中的标签。这允许处理多个命名空间和命名空间别名。

以下 Python 代码提供了一个解决方案:

<code class="python">from io import StringIO  # for Python 2 import from StringIO instead
import xml.etree.ElementTree as ET

# instead of ET.fromstring(xml)
it = ET.iterparse(StringIO(xml))
for _, el in it:
    _, _, el.tag = el.tag.rpartition('}') # strip ns
root = it.root</code>

说明:

该解决方案利用ET.iterparse 函数,增量处理 XML 文档。在迭代期间,通过使用 rpartition('}') 删除命名空间来修改每个元素 el 的标签。这有效地从所有标签中剥离了命名空间。

好处:

这种方法允许您在搜索元素时忽略命名空间前缀,从而简化了过程并无需手动指定命名空间。

以上是如何忽略 ElementTree 元素位置中的命名空间:一个简单的解决方案?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn