2010-03-30 79 views
7

我正在尝试使用lxml 2.x获取具有特定xsd类型的元素列表,并且我无法弄清楚如何遍历特定类型的xsd。架构使用lxml查找基于xsd类型的元素

例子:

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

理想的功能将类似于:

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

示例XML数据

elements = getElems(xml_doc, 'string90') 

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

回答

5

真的是唯一的特殊支持LXML具有XML模式,如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表达式必须看每一个元素,所以如果你可以收紧最多只能看在你在乎它会走得更快文档的小节。