LINUX.ORG.RU

Java parse invalid xml

 ,


0

2

А Жабку можно научить битые xml-ки парсить?

<?xml version="1.0" encoding="utf-8"?>
<document>
  <tag>Текст</tag>
  <какая-то хренотень </tag>
  <tag>Текст</tag>
</document>

Если нет, какие-нибудь сторонние парсеры для таких случаев есть?

До чего народ обленился.

    org.xml.sax.XMLReader xmlReader =
      org.xml.sax.helpers.XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
    xmlReader.setContentHandler(new Parser());
    xmlReader.parse(new InputSource(stream));

	private class Parser extends DefaultHandler{
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    }

    public void endElement(String uri, String localName, String qName) throws SAXException {
    }

    public void startDocument() throws SAXException {  
    }

    public void endDocument() throws SAXException {
    }

    public void error(SAXParseException e) throws SAXException {
    }

    public void fatalError(SAXParseException e) throws SAXException {
    }

    public void warning(SAXParseException e) throws SAXException {
    }
  }
anonymous
()

Всё просто: битый XML — это не XML. XML должен быть как минимум well-formed, иначе это не XML. Это что угодно: замысловатый текст; похожий на XML формат с угловыми скобками, но никак, ни в коем случае не XML. А XML-парсеры годятся только для парсинга XML, как бы странно это ни звучало.

CARS ★★★★
()

Всё просто: битый XML — это не XML.

Я тоже начинаю думать, что неправильные файлы лучше сразу объявить неXML-лем и пропустить. Потом уже отдельно разбираться.

Можно, как выше в примере и через SAX до первой ошибки, а дальше, как получится. Но хочется чего-нибудь более ленивого, чтобы оно само все переварило и выдало уже конечный результат. В общем, склоняюсь к HTML парсерам, jsoup тот же. Они как раз заточены хоть что-то выдать, даже в запущенных случаях.

somedelkin
() автор топика
Ответ на: комментарий от somedelkin

Мы в подобном случае ставим на вход фильтр, который читает входной поток и выдает исправленный выходной в соответствии с нашими [текущими] предоставлениями о том, как полечить проблему минимальными усилиями. Даже sax'а в общем случае не надо, можно обойтись сопоставлением строк. Например, в Вашем случае достаточно строку

<какая-то
заменить на
<tag>какая-то
и потом остаток потока докопировать как есть.

Естественно, такое решение сильно зависит от конкретного содержимого и неизменности того кода, которой порождает этот «типа XML». Но практика показала, что «более умные» решения точно так же беззащитны перед внезапными изменениями в ошибках входных данных, так что проще поставить для себя «стоп-сигнал», чем пытаться заранее предугадывать, а как же ещё могут выпендриться программисты наших контрагентов.

AlexM ★★★★★
()
Последнее исправление: AlexM (всего исправлений: 2)
Ответ на: комментарий от somedelkin

Но хочется чего-нибудь более ленивого, чтобы оно само все переварило и выдало уже конечный результат

такого не получится, потому что ошибки могут быть очень разные.
всегда делал через sax.

vtVitus ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.