我正在尝试在我的代码库和许多项目中构建我的第一个XML模式验证器作为可重用的组件。我花了一整天的时间来尝试跟踪示例并对其进行编码,现在已经开始运行概念证明。
唯一的问题是,它给了我误报:它的验证XML实例绝对应该失败。我已经在3个模式上测试了它:1个模式它与之相配得很漂亮,现在它与最后两个模式行为不当(误报)。我相信它,因为我尝试的第一个模式/实例对非常简单。我现在正试图在更复杂的例子上使用它,这很令人窒息。
以下是完成SAX验证的validate
方法的主体:
schema = getSchemaAsString();
targetXml = "ijeioj489fu4u8";
SAXParserFactory oSAXParserFactory = SAXParserFactory.newInstance();
SAXParser oSAXParser = null;
oSAXParserFactory.setNamespaceAware(true);
try
{
SchemaFactory oSchemaFactory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
oSAXParserFactory.setSchema(oSchemaFactory.newSchema(new SAXSource(new InputSource(new StringReader(schema)))));
oSAXParser = oSAXParserFactory.newSAXParser();
DefaultHandler handler = new DefaultHandler();
oSAXParser.parse(new InputSource(new StringReader(targetXml)), handler);
}
catch(Exception oException)
{
throw oException;
}
schema
和targetXml
是内存中的XML字符串(非文件URI),其中包含以下值:
schema
字符串:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="PayloadMessage">
<xs:complexType>
<xs:sequence>
<xs:element name="MessageID" type="xs:long"/>
<xs:element name="Timestamp" type="xs:long"/>
<xs:element name="MessageAction" type="xs:string"/>
<xs:element name="ContentType" type="xs:string"/>
<xs:element name="ContentID" type="xs:string"/>
<xs:element name="Payload" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
显然,给定的targetXml
应该对其给定的架构失败。 没有。 SAX内容中没有任何异常被抛出。
我有感觉我需要对DefaultHandler
做些什么,但不确定......我去了http://www.w3.org/2001/03/webdata/xsv并确认我的架构有效。
有人跳出来吗?提前谢谢!
答案 0 :(得分:1)
您必须设置一个将抛出SAXException
的错误处理程序。默认行为是尝试解析文档,即使它无效。 DefaultHandler
实施ErrorHandler
,但如果出现错误或警告则无法执行任何操作。
Javadoc警告:如果应用程序未注册ErrorHandler,则XML解析错误将不会报告,除非因为致命错误而抛出SAXParseExceptions。为了检测有效性错误,必须注册使用error()调用的ErrorHandler。
我推荐这个优秀的tutorial和XML验证的例子。这对我最有帮助。