3)xml验证和dtd验证_验证XML时使用本地资源

在无法访问互联网的环境中,XML验证成为一个挑战。XML目录提供了解决方案,允许将在线模式位置映射到本地文件系统。通过设置解析器,验证时将查找本地模式而非在线URL。此方法适用于SAX、DOM等,并有两个主要用例:本地模式文件验证和替代导入/包含模式。注意,JDK内部类基于Apache XML解析库,推荐使用Apache库。Spring等框架也有类似机制,可以通过自定义EntityResolver实现。
摘要由CSDN通过智能技术生成

3)xml验证和dtd验证

根据您的企业安全策略,某些(如果不是大多数的话)中间件服务器无法访问Internet。 当您的开发基础架构与Internet(例如银行或安全公司)隔离时,情况甚至更糟。 在这种情况下,根据架构验证XML真是一场噩梦。

当然,您可以将XML模式位置设置为硬盘驱动器上的位置。 但是关于您的同事呢? 他们将不得不在完全相同的文件系统层次结构中拥有模式,这不会解决您有关生产环境的问题...

XML目录

XML目录是您的难题的名义解决方案。 实际上,您插入了一个解析器,该解析器知道如何将在线位置映射到文件系统上的某个位置(或更确切地说是另一个位置)。 此解析器是通过xml.catalog.files系统属性设置的,该属性对于每个开发人员或在生产环境中可能有所不同:

<catalogxmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <systemsystemId="http://blog.frankel.ch/xmlcatalog/person.xsd"uri="person.xsd"/>
    <systemsystemId="http://blog.frankel.ch/xmlcatalog/order.xsd"uri="order.xsd"/>
</catalog>

现在,当验证发生时,它不是查找联机模式URL位置,而是查找本地模式。

如何

XML目录可以与JAXP,SAX,DOM或STaX一起使用。 下面详细说明如何将代码与SAX一起使用的代码。

SAXParserFactoryfactory=SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);
XMLReaderreader=factory.newSAXParser().getXMLReader();

// Set XSD as the schema language
reader.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage","http://www.w3.org/2001/XMLSchema"); (2)

// Use XML catalogs
reader.setEntityResolver(newCatalogResolver()); (1)
InputStreamstream=getClass().getClassLoader().getResourceAsStream("person.xml");
reader.parse(newInputSource(stream));

有两行很重要:

  1. 我们告诉读者使用XML目录
  2. 我们绝对必须使用阅读器,而不是SAX解析器来解析XML或将在线进行验证!

用例

XML目录基本上有两个用例:

  1. 如上所示,第一个用例是针对缓存的本地模式文件验证XML文件
  2. 除此之外,XML目录还可以用作LSResourceResolver的替代方法(如先前在使用导入/包含模式的XML验证中所见)

重要的提示

请注意:JDK中的内部com.sun软件包中提供了CatalogResolver类,但是Apache XML解析器库可以完成此工作。 实际上,内部类只是对Apache类的重新包装。

如果使用Maven,则依赖关系如下:

<dependency>
    <groupId> xml-resolver </groupId>
    <artifactId> xml-resolver </artifactId>
    <version> 1.2 </version>
</dependency>

超越目录

目录是映射在线模式位置的基于文件系统的标准方法。

但是,这并不总是最好的选择策略。 例如,Spring在JAR内提供了其不同的模式,以及类,并且针对这些模式进行了验证。

为了执行相同的操作,请替换上面代码中的第13行,而不是CatalogResolver ,而是使用您自己的EntityResolver实现。

您可以在此处找到本文的源代码(请注意,关联的测试使用自定义的安全策略文件来防止网络访问,如果要直接在IDE中进行测试,则应重用POM中使用的系统属性)。

翻译自: https://blog.frankel.ch/use-local-resources-when-validating-xml/

3)xml验证和dtd验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值