Java SAXParser Ложные срабатывания - PullRequest
3 голосов
/ 09 декабря 2011

Я пытаюсь создать свой первый валидатор XML-схемы в качестве компонента многократного использования в моей кодовой базе и во многих проектах. Я провел весь день, пытаясь следовать примерам и кодировать их, и теперь у меня есть подтверждение концепции и запуск.

Единственная проблема заключается в том, что он дает мне ложных срабатываний : он проверяет экземпляры XML, которые должны быть абсолютно ошибочными. Я проверил его на 3 схемах: с 1 схемой, с которой он прекрасно работал, и теперь он плохо работает с двумя последними (ложные срабатывания). Я верю, потому что первая пара схемы / экземпляра, которую я попробовал, была чрезвычайно простой. Сейчас я пытаюсь использовать его на более сложных примерах, и он задыхается.

Вот тело метода validate, в котором выполняется проверка SAX:

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 и подтвердил, что моя схема действительна.

У кого-нибудь что-нибудь выпрыгивает? Заранее спасибо!

1 Ответ

1 голос
/ 09 декабря 2011

Вы должны установить обработчик ошибок, который будет выдавать SAXException. Поведение по умолчанию заключается в попытке анализа документа, даже если он недействителен. DefaultHandler реализует ErrorHandler, но реализация в случае ошибки или предупреждения ничего не делает .

Javadoc ПРЕДУПРЕЖДЕНИЕ. Если приложение не регистрирует ErrorHandler, об ошибках синтаксического анализа XML не сообщается, за исключением того, что SAXParseException будет выдаваться для критических ошибок. Для обнаружения ошибок достоверности необходимо зарегистрировать ErrorHandler, который делает что-то с вызовами error ().

Я рекомендовал этот превосходный учебник с примерами проверки XML. Это было очень полезно для меня.

...