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中搜索了其他模式解析器,但現在沒有什麼適合這種情況。
問候,
你能發佈預期的結果嗎? – 2011-08-04 17:51:03