使用OpenGIS ISO 19139 XSD验证XML遇解析错误求助
解决ISO 19139 20060504版XSD本地验证失败的问题
前置准备
确保已完整下载20060504版本的整个ISO 19139 XSD目录结构,包括gco、gmd、gmi等所有子目录及其中的文件。这套XSD是互相依赖的模块化结构,仅单独下载gmd.xsd会导致依赖缺失。
Python lxml解决方案
问题根源
XSD文件中的import语句使用网络URI(如http://schemas.opengis.net/iso/19139/20060504/gco/gco.xsd),lxml默认尝试从网络获取资源,但本地已有文件时,需要将网络URI映射到本地路径才能正确解析依赖的类型定义(如AbstractObject_Type)。
解决代码
from lxml import etree class LocalSchemaResolver(etree.Resolver): def resolve(self, url, id, context): # 把网络URI替换为本地schema文件路径 if url.startswith("http://schemas.opengis.net/iso/19139/20060504/"): local_path = url.replace("http://schemas.opengis.net/iso/19139/20060504/", "schema/19139/20060504/") return self.resolve_filename(local_path, context) return None # 配置解析器,添加自定义路径解析器 parser = etree.XMLParser() parser.resolvers.add(LocalSchemaResolver()) # 加载并解析schema schema_xml = etree.parse("schema/19139/20060504/gmd/gmd.xsd", parser=parser) schema_xml.xinclude() schema = etree.XMLSchema(schema_xml) # 验证目标XML文件 xml_doc = etree.parse("file.xml") schema.assertValid(xml_doc)
xmllint解决方案
问题根源
xmllint默认会尝试从网络加载外部实体,而本地已下载完整XSD包,需指定本地schema根目录让工具优先从本地查找依赖。
修正命令
xmllint --schema schema/19139/20060504/gmd/gmd.xsd --path schema/19139/20060504/ file.xml --noout
--path参数指定了schema的根目录,xmllint会基于该路径查找所有依赖的XSD文件,无需从网络下载。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

