如何针对包含没有架构位置的导入的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"/>
...
已经阅读并尝试过:
无法从架构中删除此导入,因为它包含xml:lang属性的引用。
在变体1 中使用systemId = null
激发的ResourceResolver resolveResource方法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);
但有一个例外:
没有new StreamSource("http://www.w3.org/XML/1998/namespace")
org.xml.sax.SAXParseException:src-resolve:无法将名称'xml:lang'解析为(n)'属性声明'。
并使用此new StreamSource("http://www.w3.org/XML/1998/namespace")
org.xml.sax.SAXParseException:s4s-elt-character:除了'xs:appinfo'和'xs:documentation'之外的架构元素中不允许使用非空白字符.Saw'“xml:”命名空间”。
非常感谢任何帮助。
答案 0 :(得分:8)
http://www.w3.org/XML/1998/namespace
命名空间的XML架构位于此处:
的 http://www.w3.org/2001/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="http://www.w3.org/2001/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目录)
答案 1 :(得分:-2)
只需删除:
<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd">
来自xml.xsd
并改变
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
到
如果是同样的错误,它会很有用。