Проверка XMLSchema на Android
Я поддерживаю Проект JDOM, и я пытаюсь "сертифицировать" его на Android. Большинство из них прекрасно работают, но проверка XML-схемы является проблематичной...
Мои вопросы: есть ли способ сделать проверку XMLSchema на Android? Если есть, как?
Вопросы, подобные этому, задавались раньше, но окончательный ответ не указан:
Это то, что я сейчас знаю (исправьте меня, если я ошибаюсь)...:
- SchemaFactory.newInstance( " http://www.w3.org/2001/XMLSchema" ) - не работает с IllegalArgumentException
- по умолчанию "ExpatParser" в Android из проекта Harmony не поддерживает проверку XMLSchema.
- Можно загружать Xerces в Android-приложение и даже анализировать его, но не выполнять синтаксический анализ Validating, когда вы пытаетесь получить исключения FATAL для Android, вызывающие сбои приложений.
Я работаю над этим в течение некоторого времени, и я собрал следующие "исследования":
Если у кого-то больше информации о проверке XMLSchema на Android, я бы очень признателен за любой вход.
Если кто-то успешно выполнил проверку XMLSchema на XML и может помочь мне получить функциональность, работающую в JDOM, они получат тысячи интернет-точек...;-) и будут увековечены в коде JDOM и зафиксировать сообщения.
Ответы
Ответ 1
Я восхищен тем, что через несколько лет это все еще остается открытой проблемой.
Однако, похоже, только плохие новости. Согласно AOSP Issue Tracker Проверка схемы в настоящее время кажется неподдерживаемой стандартными API для Android, и Google, похоже, не хочет ее исправлять:
Наши XML-API (включая SAX, XmlPull и DOM) не поддерживают ни один из следующее:
XML Schema
XML DTDs (including external entity declarations and references)
validation
element content whitespace
Однако один комментатор того же билета ссылается на обходной путь и предоставляет примерный код с использованием порта Xerces. Я не знаю, если это выходит за рамки того, что вы выяснили, до сих пор, но я надеюсь, что это поможет.
Чтобы обернуть это:
SchemaFactoryFinder знает только следующие определения Схемы:
Использование любого другого определения схемы приводит к сбою (оно будет регистрироваться на уровне отладки). Очевидно, это относится к вам, поскольку вы используете другую ссылку на схему 2011 года. Поэтому "правильно", ссылаясь на определение схемы, должно исправить эту проблему.
Ответ 2
Я думаю, вы могли бы использовать RelaxNG - есть много доступных валидаторов.
http://relaxng.org/#validators
Особый интерес должен быть
- http://www.kohsuke.org/relaxng/bali/doc/
- https://msv.java.net/
- http://www.davidashen.net/rnv.html
Последний является реализацией C, первые два написаны на Java.
Если вам нужна высокая производительность, вы можете написать код JNI и позвонить
функции в источнике rnv. Более простой подход - просто построить
rnv для Android, используя NDK, а затем называет его исполняемым с параметрами.
Что-то вроде
Process p = Runtime.exec("/path/to/rnv/exec", [valdidationDoc: String, some more params]);
OutputStream out = p.getOutputStream(); // connected to STDIN of p
InputStream in = p.getInputStream(); // connected to STDOUT of p
out.write(new FileInputStream("/path/to/xml"));
/// read in for succes/errors
Ответ 3
Я использую
javax.xml.parsers.DocumentBuilder;
javax.xml.parsers.DocumentBuilderFactory;
javax.xml.parsers.ParserConfigurationException;
Если вы получили XML-строку, вы можете ее проанализировать:
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
пожалуйста, не забывайте об обработке исключений.