Java XSD 验证器找不到元素声明



我有一个简单的模式验证器方法:

// Throws runtime exception if anything goes wrong.
public void validate(String schemaURL, String xml) throws Throwable {
    SAXParserFactory oSAXParserFactory = SAXParserFactory.newInstance();
    SAXParser oSAXParser = null;
    oSAXParserFactory.setNamespaceAware(true);
    SchemaFactory oSchemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    oSAXParserFactory.setSchema(oSchemaFactory.newSchema(new URL(schemaURL)));
    oSAXParser = oSAXParserFactory.newSAXParser();
    SaxErrorHandler handler = new SaxErrorHandler();
    oSAXParser.parse(new InputSource(new StringReader(xml)),handler);
}

我有一个托管在http://myserver.com/schemas/app-config/1.0/app-config-1.0.xsd的架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="application">
        <xs:complexType>
            <xs:choice>
                <xs:element ref="info"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:element name="info">
        <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

观察该架构的以下实例:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://myserver.com/schemas/app-config/1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://myserver.com/schemas/app-config/1.0
        http://myserver.com/schemas/app-config/1.0/app-config-1.0.xsd">
    <info
        name="Dummy Application"
    />
</application>

当我传递我的validate方法时,以下内容:

String xmlInstance = readXMLIntoString();
String schemaURL = "http://myserver.com/schemas/app-config/1.0/app-config-1.0.xsd";
validate(schemaURL, xmlInstance);

我收到以下错误:

org.xml.sax.SAXParseException: cvc-elt.1:找不到元素"application"的声明。

  • 我的架构有问题吗?
  • 我的实例是否无效?
  • 我实际在 URL 上托管架构是否有问题(尽管此示例中使用的架构是模型,但我向您保证 XSD 文件确实托管在我在代码中点击的 URL 上)?

为什么验证者找不到application声明?

您的 XML 架构缺少 targetNamespace

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://myserver.com/schemas/app-config/1.0"
  elementFormDefault="qualified">
  ...

与其在XML模式中声明targetNamespace,不如从XML中删除所有笨拙的巨无霸

<application>
  ...

不过,尝试坚持第一个解决方案。

我最初的回答说schemaLocation是不正确的,事实上是这样,但原因与我最初建议的原因不同。正如科汉伊·罗贝尔所说,您的架构缺少targetNamespace .要么按照他的方法修改你的架构,要么用noNamespaceSchemaLocation替换schemaLocation

最新更新