Я пытаюсь создать свой первый валидатор 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 и подтвердил, что моя схема действительна.
У кого-нибудь что-нибудь выпрыгивает? Заранее спасибо!