【问题标题】:Java XSD validator can't find element declarationJava XSD 验证器找不到元素声明
【发布时间】:2012-06-07 12:52:21
【问题描述】:

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

// 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: 找不到元素“应用程序”的声明。

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

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

【问题讨论】:

  • 注意: 我认为人们通常会感到困惑的一件事是 XML 命名空间与实际 URL 没有任何关系。您看到使用 URL 的原因是它是一种保证唯一性的简单方法。我知道,如果我将公司的域名用于我所有的命名空间,它不会与其他任何人的命名空间发生冲突。此外,没有规则说,如果命名空间看起来像一个 URL,那么它实际上必须是一个有效的 URL。它只能返回 404。

标签: java xml xsd schema sax


【解决方案1】:

我最初的回答说 schemaLocation 不正确,实际上是这样,但原因与我最初建议的不同。正如 Kohányi Róbert 所说,您的架构缺少 targetNamespace。要么按照他的方法修改你的架构,要么用noNamespaceSchemaLocation替换schemaLocation

【讨论】:

  • xsi:schemaLocation 小写​​字母是正确的,根据 XML 规范。 W3C 验证器将文档验证为格式正确的 XML。
  • 你说的很对,我犯了不检查架构验证是否真的触发的错误。我已经用schemaLocation 不起作用的实际原因更新了我的答案。
  • 我相应地删除了我的反对票。现在你的答案很有意义;)
【解决方案2】:

您的 XML 架构缺少 targetNamespace

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

您可以从 XML 中删除所有 mumbo jumbo,而不是在 XML 架构中声明 targetNamespace

<application>
  ...

仍然,尝试坚持第一个解决方案。

【讨论】:

  • 是的,在您的 XML 中始终使用命名空间是一种很好的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多