忽略 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中文网其他相关文章!