我正试图在我的代码库和许多项目中将我的第一个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应该对其给定的模式失败。 No .没有异常在SAX中的任何地方被抛出。
我有种感觉,我需要用DefaultHandler做点什么,但不确定.我去了http://www.w3.org/2001/03/webdata/xsv并确认我的模式是有效的。
有什么东西能跳出来吗?提前感谢!
发布于 2011-12-08 20:45:29
您必须设置一个将引发SAXException的错误处理程序。默认行为是尝试解析文档,即使它是无效的。DefaultHandler实现了ErrorHandler,但是在出现错误或警告的情况下实现什么也不做。
Javadoc警告:如果应用程序没有注册ErrorHandler,则将不报告XML解析错误,除非SAXParseExceptions会因致命错误而引发。为了检测有效性错误,必须注册使用error()调用执行某些操作的ErrorHandler。
我再次推荐了这个优秀的教程,并给出了有关XML验证的示例。这对我很有帮助。
https://stackoverflow.com/questions/8437198
复制相似问题