XML Catalog是什么 如何用它来解析本地DTD/XSD文件

来源:建站技术作者:缓存小熊猫头衔:程序员
导读:本期聚焦于小伙伴创作的《XML Catalog是什么 如何用它来解析本地DTD/XSD文件》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《XML Catalog是什么 如何用它来解析本地DTD/XSD文件》有用,将其分享出去将是对创作者最好的鼓励。

XML Catalog是OASIS制定的一种用于映射XML外部标识符到本地资源的规范,主要作用是让XML解析器在解析XML文件时,优先从本地路径加载DTD、XSD等外部资源,而不是去访问网络上的对应地址,既可以提升解析速度,也能避免网络不可用时的解析失败问题。

XML Catalog是什么 如何用它来解析本地DTD/XSD文件

XML Catalog的核心概念

XML Catalog本质上是一个XML格式的配置文件,里面定义了外部资源的映射规则,常见的映射类型有两种:

  • 公共标识符映射:针对XML文件中声明的公共ID进行映射,比如<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ...>中的公共ID部分。
  • 系统标识符映射:针对XML文件中声明的系统路径(通常是URL)进行映射,比如上述声明中后面的DTD网络地址。

解析本地DTD文件的配置与实现

以Java环境为例,使用Xerces解析器配合XML Catalog解析本地DTD文件的步骤如下:

1. 准备本地DTD文件和Catalog配置

假设本地有一个自定义的DTD文件,路径为/opt/local_dtd/user.dtd,内容如下:

<!ELEMENT user (name, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>

编写Catalog配置文件catalog.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <!-- 映射系统标识符到本地DTD -->
    <system systemId="http://ipipp.com/dtd/user.dtd" uri="/opt/local_dtd/user.dtd"/>
</catalog>

2. 编写解析代码

Java代码如下:

import org.apache.xerces.parsers.DOMParser;
import org.apache.xml.resolver.CatalogManager;
import org.apache.xml.resolver.tools.CatalogResolver;
import java.io.File;

public class DtdParseDemo {
    public static void main(String[] args) throws Exception {
        // 初始化Catalog管理器
        CatalogManager catalogManager = new CatalogManager();
        // 设置Catalog配置文件路径
        catalogManager.setCatalogFiles("file:///opt/catalog.xml");
        CatalogResolver resolver = new CatalogResolver(catalogManager);

        // 创建解析器并设置解析器属性
        DOMParser parser = new DOMParser();
        parser.setFeature("http://xml.org/sax/features/validation", true);
        // 设置实体解析器为CatalogResolver
        parser.setEntityResolver(resolver);

        // 解析包含DTD引用的XML文件
        File xmlFile = new File("/opt/test_user.xml");
        parser.parse(xmlFile.getAbsolutePath());

        System.out.println("DTD解析完成,无错误");
    }
}

待解析的XML文件test_user.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "http://ipipp.com/dtd/user.dtd">
<user>
    <name>张三</name>
    <age>25</age>
</user>

解析本地XSD文件的配置与实现

解析本地XSD文件的思路和解析DTD类似,只是映射的目标资源是XSD文件,同时解析器需要开启Schema验证功能。

1. 准备本地XSD文件和Catalog配置

本地XSD文件路径为/opt/local_xsd/user.xsd,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="user">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="age" type="xs:integer"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

更新Catalog配置文件,添加XSD的映射规则:

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <system systemId="http://ipipp.com/dtd/user.dtd" uri="/opt/local_dtd/user.dtd"/>
    <!-- 映射XSD系统标识符到本地文件 -->
    <system systemId="http://ipipp.com/xsd/user.xsd" uri="/opt/local_xsd/user.xsd"/>
</catalog>

2. 编写XSD解析代码

Java代码如下:

import org.apache.xerces.parsers.DOMParser;
import org.apache.xml.resolver.CatalogManager;
import org.apache.xml.resolver.tools.CatalogResolver;
import java.io.File;

public class XsdParseDemo {
    public static void main(String[] args) throws Exception {
        CatalogManager catalogManager = new CatalogManager();
        catalogManager.setCatalogFiles("file:///opt/catalog.xml");
        CatalogResolver resolver = new CatalogResolver(catalogManager);

        DOMParser parser = new DOMParser();
        // 开启Schema验证
        parser.setFeature("http://apache.org/xml/features/validation/schema", true);
        parser.setEntityResolver(resolver);

        File xmlFile = new File("/opt/test_user_xsd.xml");
        parser.parse(xmlFile.getAbsolutePath());

        System.out.println("XSD解析完成,无错误");
    }
}

待解析的XML文件test_user_xsd.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<user xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="http://ipipp.com/xsd/user.xsd">
    <name>张三</name>
    <age>25</age>
</user>

注意事项

  • Catalog配置文件的路径需要是解析器可访问的绝对路径,或者配置为相对路径时确保解析器的工作目录正确。
  • 如果同时有公共ID和系统ID的映射需求,优先配置系统ID映射,因为大部分XML文件的外部资源引用会同时包含系统ID。
  • 不同编程语言的XML解析库对XML Catalog的支持方式略有差异,但核心都是加载Catalog配置文件并替换默认的实体解析器。

XML_CatalogDTDXSDXML解析修改时间:2026-07-07 20:51:33

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。