Проверка XMLSchema на Android - программирование
Подтвердить что ты не робот

Проверка 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 и зафиксировать сообщения.

4b9b3361

Ответ 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);

пожалуйста, не забывайте об обработке исключений.