首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java SAXParser假阳性

Java SAXParser假阳性
EN

Stack Overflow用户
提问于 2011-12-08 20:24:18
回答 1查看 412关注 0票数 3

我正试图在我的代码库和许多项目中将我的第一个XML模式验证器构建为一个可重用的组件。我花了一整天的时间来跟踪这些例子并对它们进行编码,现在我已经有了一个概念建立和运行的证据。

唯一的问题是,它给了我假阳性:它的验证应该是绝对失败的实例。我已经在3种模式上测试了它:1它工作得很好,现在它在最后两种模式(假阳性)中的错误行为。我认为这是因为我尝试的第一个模式/实例对非常简单。我现在正试图在更复杂的例子中使用它,它令人窒息。

下面是执行SAX验证的validate方法的主体:

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

其中schematargetXml是内存中的XML字符串(而不是文件URI),给出以下值:

schema字符串:

代码语言:javascript
复制
<?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并确认我的模式是有效的。

有什么东西能跳出来吗?提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-08 20:45:29

您必须设置一个将引发SAXException的错误处理程序。默认行为是尝试解析文档,即使它是无效的。DefaultHandler实现了ErrorHandler,但是在出现错误或警告的情况下实现什么也不做

Javadoc警告:如果应用程序没有注册ErrorHandler,则将不报告XML解析错误,除非SAXParseExceptions会因致命错误而引发。为了检测有效性错误,必须注册使用error()调用执行某些操作的ErrorHandler。

我再次推荐了这个优秀的教程,并给出了有关XML验证的示例。这对我很有帮助。

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

https://stackoverflow.com/questions/8437198

复制
相关文章

相似问题

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