我想在python中检查一个XSD架构。目前我正在使用lxml,当它只需要针对模式验证文档时,它正在非常好地完成它的工作。但是,我想知道模式内部的内容并访问lxml行为中的元素。
架构:
<?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代码(简称):
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
元素。
目前解决问题的方法是解析第一个模式文档,然后加载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中搜索过其他模式解析器,但是现在没有什么能适合这种情况。
问候,