首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java验证程序找不到元素声明

Java验证程序找不到元素声明
EN

Stack Overflow用户
提问于 2012-06-02 17:40:04
回答 2查看 4.4K关注 0票数 4

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

代码语言:javascript
复制
// 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托管的模式

代码语言:javascript
复制
<?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>

观察该模式的以下实例:

代码语言:javascript
复制
<?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方法时,如下所示:

代码语言:javascript
复制
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声明?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-02 17:57:31

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

票数 2
EN

Stack Overflow用户

发布于 2012-06-02 18:18:18

您的XML缺少一个targetNamespace。

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://myserver.com/schemas/app-config/1.0"
  elementFormDefault="qualified">
  ...

与在XML中声明targetNamespace不同,您可以从XML中删除所有那些杂乱无章的内容。

代码语言:javascript
复制
<application>
  ...

尽管如此,还是要坚持第一个解决方案。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10864536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档