在 lxml 中设置默认命名空间映射

Set default namespace mapping in lxml

提问人:raywib 提问时间:11/8/2023 更新时间:11/8/2023 访问量:38

问:

当使用 lxml 处理 XML 时,我的代码最终如下所示:

from lxml import etree

NSMAP = {
  'ns1': 'https://example.com/ns1/',
  'ns2': 'https://example.com/ns2/',
}

root = etree.parse('/some/file.xml')
root.find(..., namespaces=NSMAP)
root.iterfind(..., namespaces=NSMAP)
root.xpath(..., namespaces=NSMAP)

有没有办法省略重复的内容并将其设置为元素的默认值?namespaces=NSMAP

蟒蛇 LXML

评论


答:

-1赞 MUX_ON_WINDOWS 11/8/2023 #1

您可以通过在 lxml 中为元素设置默认命名空间来简化代码。为此,可以创建包含默认命名空间的自定义 Element 类。下面是如何实现此目的的示例:

from lxml import etree

class DefaultNamespaceElement(etree.ElementBase):
    def find(self, path, *args, **kwargs):
        return super().find(path, namespaces=NSMAP, *args, **kwargs)

    def iterfind(self, path, *args, **kwargs):
        return super().iterfind(path, namespaces=NSMAP, *args, **kwargs)

    def xpath(self, path, *args, **kwargs):
        return super().xpath(path, namespaces=NSMAP, *args, **kwargs)

# Create a custom parser with the DefaultNamespaceElement class
parser = etree.XMLParser(target=DefaultNamespaceElement)

# Parse your XML file using the custom parser
root = etree.parse('/some/file.xml', parser)

# Now you can use the find, iterfind, and xpath methods without specifying namespaces
result = root.find('...', namespaces=NSMAP)  # No need to specify namespaces=NSMAP

评论

0赞 starball 11/9/2023
在撰写这篇回答文章时,您是否使用了任何生成式 AI?
0赞 MUX_ON_WINDOWS 11/10/2023
我确实使用人工智能使我的英语句子变得好听