【问题标题】:Find elements based on xsd type with lxml使用 lxml 根据 xsd 类型查找元素
【发布时间】:2011-02-02 07:26:06
【问题描述】:

我正在尝试使用 lxml 2.x 获取具有特定 xsd 类型的元素列表,但我不知道如何遍历特定类型的 xsd。

架构示例:

<xsd:element name="ServerOwner" type="srvrs:string90" minOccurs="0">
<xsd:element name="HostName" type="srvrs:string35" minOccurs="0">

xml 数据示例:

<srvrs:ServerOwner>John Doe</srvrs:ServerOwner>
<srvrs:HostName>box01.example.com</srvrs:HostName>

理想的函数如下所示:

    elements = getElems(xml_doc, 'string90')

    def getElems(xml_doc, xsd_type):
      ** xpath or something to find the elements and build a dict
      return elements

【问题讨论】:

    标签: python xml xsd lxml


    【解决方案1】:

    真的,lxml 对 XML Schema 的唯一特殊支持,如 here 所见,是告诉您某些文档是否根据某些模式有效。任何更复杂的事情你必须自己做。

    我认为这应该是一个相对简单的两阶段过程——获取架构中与您关心的类型匹配的所有 xsd:element 元素,并查看它们的名称:

    def getElems(schemaDoc, xmlDoc, typeName):
        names = schemaDoc.xpath("//xsd:element[@type = $n]/@name",
                                namespaces={"xsd": 
                                            "http://www.w3.org/2001/XMLSchema"},
                                n=typeName)
    

    然后,从文档中获取具有每个名称的所有元素。

        elements = []
        for name in names: 
            namedElements = xmlDoc.xpath("//*[local-name() = $name]", name=name)
            elements.extend(namedElements)
    

    现在您有了一个名称与架构中的类型匹配的元素列表。

        return elements
    

    请注意,用于搜索文档的 xpath 表达式必须查看每个元素,因此如果您可以将其收紧到只查看您关心的文档的子部分,它会更快。

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多