Я анализирую файлы XML, которые находятся во внутренней памяти моего приложения, с помощью синтаксического анализатора SAX. Это работает без проблем, но я также хочу проверить файлы перед разбором.
Я провел небольшое исследование и нашел следующий класс для работы с Eclipse Mars и Windows 7 (источник: http://www.rgagnon.com/javadetails/java-0669.html):
public static boolean validateWithExtXSDUsingSAX(String xml, String xsd)
throws ParserConfigurationException, IOException {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI));
SAXParser parser = null;
try {
factory.setSchema(schemaFactory.newSchema(new Source[] { new StreamSource(xsd) }));
parser = factory.newSAXParser();
} catch (SAXException se) {
System.out.println("SCHEMA : " + se.getMessage()); // problem in the XSD itself
return false;
}
XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(new ErrorHandler() {
@Override
public void warning(SAXParseException e) throws SAXException {
System.out.println("WARNING: " + e.getMessage()); // do nothing
}
@Override
public void error(SAXParseException e) throws SAXException {
System.out.println("ERROR : " + e.getMessage());
throw e;
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
System.out.println("FATAL : " + e.getMessage());
throw e;
}
});
reader.parse(new InputSource(xml));
return true;
} catch (ParserConfigurationException pce) {
throw pce;
} catch (IOException io) {
throw io;
} catch (SAXException se) {
return false;
}
}
Но когда я хочу использовать этот класс с Android Studio 1.3 и Android 5.1 (API 22), я получаю только ошибки:
java.lang.IllegalArgumentException: http://www.w3.org/2001/XMLSchema
at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:192)
Но, согласно странице разработки, это должно быть правильно: http://developer.android.com/reference/javax/xml/validation/SchemaFactory.html
Должен ли я использовать другую форму проверки моих XML-файлов на Android?
заранее спасибо
PS: я должен использовать SAX, нет возможности использовать другой парсер.
РЕДАКТИРОВАТЬ: при использовании этого решения VenomFangs Я получаю эту ошибку:
java.lang.NullPointerException: Attempt to invoke virtual method 'javax.xml.validation.Validator javax.xml.validation.Schema.newValidator()' on a null object reference