【发布时间】: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。