我有一个简单的模式验证器方法:
// 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‘的声明。
为什么验证器找不到application声明?
发布于 2012-06-02 17:57:31
我最初的回答是,schemaLocation是不正确的,事实上是这样的,但原因与我最初提出的不同。正如Kohányi Róbert所说,您的架构缺少一个targetNamespace。要么按照他的方法修改您的模式,要么用schemaLocation替换noNamespaceSchemaLocation。
发布于 2012-06-02 18:18:18
您的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>
...尽管如此,还是要坚持第一个解决方案。
https://stackoverflow.com/questions/10864536
复制相似问题