Подтвердить что ты не робот

Проверка синтаксиса XML в Java

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

Я смотрел некоторые сообщения SO, подобные этим...

... но я понял, что не хочу проверять структуру XML файла; Я не хочу проверять XML-схему (XSD)... Я просто хочу проверить синтаксис XML и определить, правильно ли он.

4b9b3361

Ответ 1

Вы можете проверить, правильно ли сформирован XML-документ, используя следующий код:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);

DocumentBuilder builder = factory.newDocumentBuilder();

builder.setErrorHandler(new SimpleErrorHandler());    
// the "parse" method also validates XML, will throw an exception if misformatted
Document document = builder.parse(new InputSource("document.xml"));

Класс SimpleErrorHandler, указанный в приведенном выше коде, выглядит следующим образом:

public class SimpleErrorHandler implements ErrorHandler {
    public void warning(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }

    public void error(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }

    public void fatalError(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }
}

Это произошло из этого веб-сайта, в котором представлены различные методы проверки XML с помощью Java. Также обратите внимание, что этот метод загружает все дерево DOM в память, см. Комментарии к альтернативам, если вы хотите сохранить в ОЗУ.

Ответ 2

Что вы спрашиваете, как проверить, что часть контента - это хорошо сформированный XML-документ. Это легко сделать, просто разрешив синтаксическому анализатору XML (попытаться) проанализировать содержимое, о котором идет речь, - если есть проблемы, парсер сообщит об ошибке, выбросив исключение. На самом деле нет ничего более; поэтому вам нужно всего лишь выяснить, как разбирать XML-документ.

О том, что нужно быть осторожным, является то, что некоторые библиотеки, которые утверждают, что они являются парсерами XML, на самом деле не являются правильными парсерами, поскольку они фактически не могут проверять вещи, которые должен выполнять парсер XML (согласно спецификации XML) - в Java, Javolution является примером того, что мало что делает для проверки; VTD-XML и XPP3 выполняют некоторую проверку (но не все необходимые проверки). И на другом конце спектра, Xerces и Woodstox проверяют все, что спецификация требует. Xerces поставляется вместе с JDK; и большинство веб-сервисов также связывают Woodstox.

Поскольку принятый ответ уже показывает, как анализировать контент в документе DOM (который начинается с разбора), этого может быть достаточно. Единственное предостережение в том, что для этого требуется, чтобы у вас было в 3-5 раз больше памяти, доступной как исходный размер входного документа. Чтобы обойти это ограничение, вы можете использовать потоковый анализатор, например Woodstox (который реализует стандартный API Stax). Если это так, вы должны создать XMLStreamReader и просто вызвать "reader.next()", пока "reader.hasNext()" возвращает true.

Ответ 3

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html Помогает ли это? Он использует XSD, который довольно устойчив. Мало того, что вы можете проверить структуру документов, но вы можете предоставить несколько довольно сложных правил о том, какой тип содержимого могут содержать ваши узлы и атрибуты.