You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:01:01