2010-03-30 17 views
7

Belirli bir xsd türü lxml 2.x olan öğeler listesini almaya çalışıyorum ve belirli türler için xsd'nin nasıl geçtiğini anlayamıyorum. şemanınlxml ile xsd türüne göre öğeleri bulun

Örnek:

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

Örnek xml veriler: İdeal fonksiyonu gibi görünecektir

<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 

cevap

5

Gerçekten sadece özel destek Lxml XML Şeması için vardır here görüldüğü gibi, bazı belgenin bazı şemaya göre mi yoksa yok mu t. Daha sofistike bir şey yapman gerekecek. Bu nispeten basit iki aşamalı bir işlem olmalıdır

, ben düşünmek istiyorum

- önemsediğiniz türüyle eşleşmesi şemadaki bütün xsd:element öğelerini almak ve onların isimlerine göz:

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

Ardından, tüm öğeleri her addan belgeden alın.

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

Şimdi şemadaki türle eşleşen adlara sahip öğeler listeniz var. Belgeyi arama için xpath ifadesi sadece daha hızlı gidersiniz önemsediğiniz belgenin alt bölümünde bakmaya o kadar sıkın olabilir eğer öyleyse, her eleman bakmak zorunda olduğu

return elements 

Not.