gpt4 book ai didi

xml - 如何缩短lxml中的过滤器查询

转载 作者:行者123 更新时间:2023-12-04 16:55:57 26 4
gpt4 key购买 nike

我正在使用 lxml 解析具有自定义 namespace 的 xml。下面给出了 xml 的摘录。

<abcd:ABCDCfg xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:abcd="http://www.xyzv.com/abcd">
<abcd:Section name="Features" display-name="Features" desc=“Parameters”>
<abcd:Param name=“mode”>
<abcd:Type>string</abcd:Type>
<abcd:Persistent>true</abcd:Persistent>
<abcd:Configurable>true</abcd:Configurable>
<abcd:ReadAccess>aup</abcd:ReadAccess>
<abcd:WriteAccess>ap</abcd:WriteAccess>
<abcd:DisplayName>Mode</abcd:DisplayName>
</abcd:Param>
</abcd:Section>
</abcd:ABCDCfg>

现在,当我在 xml 中查找值时,我正在使用这样的
sections = xmltree.findall('{http://www.xyzv.com/abcd}Section')
if (child.tag =='{http://www.xyzv.com/abcd}Param')

无论如何在 lxml 中,这将使我能够在没有命名空间的情况下使用 lxml。就像是
sections = xmltree.findall('Section')
if (child.tag =='Param')

这将使代码真正具有可读性。欢迎任何帮助。

最佳答案

如果这适用于您的情况,您可以在解析后从树中删除所有 namespace 。我会去this solution . Python 3 中的工作示例:

import lxml.etree as ET
from io import BytesIO


data = b"""<abcd:ABCDCfg xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:abcd="http://www.xyzv.com/abcd">
<abcd:Section name="Features" display-name="Features" desc="Parameters">
<abcd:Param name="mode">
<abcd:Type>string</abcd:Type>
<abcd:Persistent>true</abcd:Persistent>
<abcd:Configurable>true</abcd:Configurable>
<abcd:ReadAccess>aup</abcd:ReadAccess>
<abcd:WriteAccess>ap</abcd:WriteAccess>
<abcd:DisplayName>Mode</abcd:DisplayName>
</abcd:Param>
</abcd:Section>
</abcd:ABCDCfg>"""

it = ET.iterparse(BytesIO(data))
for _, el in it:
if '}' in el.tag:
el.tag = el.tag.split('}', 1)[1] # strip all namespaces
root = it.root

sections = root.findall('Section')
print(sections)

打印:
[<Element Section at 0x10636d0c8>]

这意味着我们可以在树中查找元素而根本不指定 namespace 。

关于xml - 如何缩短lxml中的过滤器查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37669266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com