【问题标题】:How to shorten the filter query in lxml如何缩短lxml中的过滤查询
【发布时间】:2016-06-07 01:44:49
【问题描述】:

我正在使用 lxml 解析具有自定义名称空间的 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')

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

【问题讨论】:

    标签: xml parsing xml-parsing namespaces lxml


    【解决方案1】:

    如果这适用于您的情况,您可以在解析后从树中删除所有命名空间。我会选择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>]
    

    这意味着我们可以在树中找到元素而不需要指定命名空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 2013-06-12
      相关资源
      最近更新 更多