gpt4 book ai didi

java - 针对包含 xsd :import without location 的 XSD 验证 XML

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:58 26 4
gpt4 key购买 nike

如何根据包含导入但没有架构位置的 XSD 架构验证 XML?

XSD 片段:

<xs:schema xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types
xmlns:tns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://schemas.microsoft.com/exchange/services/2006/types"
elementFormDefault="qualified" version="Exchange2010_SP2" id="types">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"/>
...

已阅读并尝试过:

This onethis too ... 不成功。

无法从架构中删除此导入,因为它包含对 xml:lang 属性的引用。

variant 1 ResourceResolver resolveResource 方法中使用 systemId = null 触发

public class ResourceResolver  implements LSResourceResolver {

public LSInput resolveResource(String type, String namespaceURI,
String publicId, String systemId, String baseURI) {

//Some implementation

return new Input(publicId, systemId, resourceAsStream);

变体 2 中这样尝试:

SchemaFactory sFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
//sFactory.setResourceResolver(new ResourceResolver());
Schema schema = sFactory.newSchema(new Source[] {
new StreamSource("http://www.w3.org/XML/1998/namespace"),
new StreamSource(MailGateMQBinding.class.getResourceAsStream("/types.xsd")),
});
validator = messageSchema.newValidator();
source = new DOMSource(inDocBody);
validator.validate(source);

但有一个异常(exception):没有 new StreamSource("http://www.w3.org/XML/1998/namespace") org.xml.sax.SAXParseException: src-resolve: 无法解析名称 'xml :lang' 到 a(n) '属性声明'。

和这个new StreamSource("http://www.w3.org/XML/1998/namespace")org.xml.sax.SAXParseException: s4s-elt-character: 除了'xs:appinfo' 和'xs:documentation' 之外的模式元素中不允许使用非空白字符.. Saw 'The "xml:"Namespace '.

如有任何帮助,我们将不胜感激。

最佳答案

http://www.w3.org/XML/1998/namespace 的 XML 模式命名空间位于此处:<强> https://www.w3.org/2009/01/xml.xsd

因此,您只需在 <xs:import> 中指定它的位置即可。在你的架构中:

<xs:schema xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types
xmlns:tns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://schemas.microsoft.com/exchange/services/2006/types"
elementFormDefault="qualified" version="Exchange2010_SP2" id="types">

<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="https://www.w3.org/2009/01/xml.xsd"/>
...

这会起作用,但请注意 W3C 不喜欢该文件的大量流量:http://www.w3.org/2001/xml.xsd .因此,他们人为地延迟了对它的访问。

许多软件都拥有此类模式的本地副本。 (这就是未指定模式位置的原因。模式软件通常从其资源中加载它)。

您也可以将其复制到您的计算机并指定该副本的 URL。

另一种方法是使用 XML 目录,像这样 (catalog.xml):

<?xml version="1.0"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<!--
This will redirect the namespace URI to the local schema file,
which should be found in the same directory as the catalog.xml
-->
<uri name="http://www.w3.org/XML/1998/namespace" uri="xml.xsd"/>
</catalog>

但是您必须以某种方式将该目录文件传递给您的模式处理器软件(如果它支持 XML 目录)

关于java - 针对包含 xsd :import without location 的 XSD 验证 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18526705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com