2010-04-27 167 views
2

我想檢查python中的XSD架構。目前我使用的是lxml,它只需要根據模式驗證文檔就可以很好地完成工作。但是,我想知道模式中的內容,並訪問lxml行爲中的元素。python:檢查XSD xml架構

的模式:

<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:include schemaLocation="worker_remote_base.xsd"/> 
    <xsd:include schemaLocation="transactions_worker_responses.xsd"/> 
    <xsd:include schemaLocation="transactions_worker_requests.xsd"/> 
</xsd:schema> 

的LXML代碼加載架構(simplyfied):

xsd_file_handle = open(self._xsd_file, 'rb') 
xsd_text  = xsd_file_handle.read() 
schema_document = etree.fromstring(xsd_text, base_url=xmlpath) 
xmlschema   = etree.XMLSchema(schema_document) 

,我就能利用schema_document(這是etree._Element)要經過架構作爲XML文檔。但由於etree.fromstring(至少看起來像這樣)期望XML文檔xsd:include元素不處理。

的問題目前通過解析第一個架構文檔解決了,然後加載包含元素,然後用手將它們插入一個接一個到主文檔:

BASE_URL   = "/xml/" 
schema_document  = etree.fromstring(xsd_text, base_url=BASE_URL) 
tree    = schema_document.getroottree() 

schemas    = [] 
for schemaChild in schema_document.iterchildren(): 
    if schemaChild.tag.endswith("include"): 
     try: 
      h = open (os.path.join(BASE_URL, schemaChild.get("schemaLocation")), "r") 
      s = etree.fromstring(h.read(), base_url=BASE_URL) 
      schemas.append(s) 
     except Exception as ex: 
      print "failed to load schema: %s" % ex 
     finally: 
      h.close() 
     # remove the <xsd:include ...> element 
     self._schema_document.remove(schemaChild) 

for s in schemas: 
# inside <schema> 
    for sChild in s: 
     schema_document.append(sChild) 

什麼我所要求的是一個想法如何通過使用更常見的方式來解決問題。我已經在python中搜索了其他模式解析器,但現在沒有什麼適合這種情況。

問候,

+0

你能發佈預期的結果嗎? – 2011-08-04 17:51:03

回答

0

PyXB可以處理的xsd:包括。我將PyXB用於Amazon.com龐大的產品模式文件,其中包含的文件包含多個級別的更多xsd文件。強烈推薦。