2010-03-30 33 views
7

Tôi đang cố gắng lấy danh sách các phần tử có loại xsd cụ thể với lxml 2.x và tôi không thể tìm ra cách đi qua xsd cho các loại cụ thể.Tìm các yếu tố dựa trên loại xsd với lxml

Ví dụ về sơ đồ:

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

Ví dụ xml dữ liệu:

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

Chức năng lý tưởng sẽ như thế nào:

elements = getElems(xml_doc, 'string90') 

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

Trả lời

5

Thực sự là chỉ hỗ trợ lxml đặc biệt có cho XML Schema , như đã thấy here, là để cho bạn biết liệu một số tài liệu có hợp lệ theo một số lược đồ hay không t. Bất cứ điều gì phức tạp hơn bạn sẽ phải tự làm.

này phải là một quá trình hai giai đoạn tương đối đơn giản, tôi nghĩ - được tất cả các yếu tố xsd:element trong lược đồ phù hợp với các loại mà bạn quan tâm, và nhìn vào tên của họ:

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

Sau đó, tìm nạp tất cả các phần tử với mỗi tên từ tài liệu.

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

Bây giờ bạn có danh sách các phần tử có tên khớp với loại trong lược đồ.

return elements 

Lưu ý rằng biểu thức xpath để tìm kiếm tài liệu phải xem xét mọi phần tử, vì vậy nếu bạn có thể siết chặt để chỉ nhìn vào phần phụ của tài liệu bạn quan tâm thì nó sẽ nhanh hơn.

Các vấn đề liên quan