2010-03-30 3 views
7

특정 xsd 유형의 요소 목록을 lxml 2.x와 함께 가져 오려고하는데 특정 유형의 xsd를 탐색하는 방법을 알 수 없습니다. 스키마의lxml을 사용하여 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 

답변

5

정말 유일한 특별 지원 LXML는 XML 스키마가 , 보이는대로 here, 어떤 문서가 어떤 스키마에 따라 유효한지 또는 아니오인지 알려주는 것입니다 티. 더 정교한 무엇이든 너 자신을해야 할 것이다. 이것은 상대적으로 간단한 2 단계 프로세스를해야

, 내가 생각하는 것

은 - 관심있는 유형과 일치 스키마의 모든 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) 

이제 스키마의 유형과 일치하는 이름의 요소 목록이 있습니다. 문서를 검색하기위한 XPath 식 당신은 단지 그것을 빨리 갈 수 있습니다에 대해 신경 문서의 하위 절에 보면 해당을 체결 할 수있는 경우에, 그래서 모든 요소를보고 있는지

return elements 

참고.

관련 문제