Мне нужно проанализировать непрерывный поток правильно сформированных XML-элементов, для которых я получил только уже созданный java.io.Reader
объект. Эти элементы не заключены в корневой элемент и не добавлены к заголовку XML, например Xml version = "1.0"?> "
, но в остальном являются допустимым XML.
Использование Java Класс org.xml.sax.XMLReader
не работает, поскольку XML Reader ожидает синтаксического анализа правильно сформированного XML, начиная с включающего корневого элемента. Таким образом, он просто считывает первый элемент в потоке, который он воспринимается как корневой и не работает в следующем, с типичным
org.xml.sax.SAXParseException: разметка в документе, следующем за корневым элементом, должна быть правильно сформирована.
Для файлов, которые не содержат корневой элемент, но там, где такой элемент существует или может быть определен (и называется, скажем, MyRootElement), можно сделать что-то вроде следующего:
Strint path = <the full path to the file>;
XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
StringBuilder buffer = new StringBuilder();
buffer.append("<?xml version=\"1.0\"?>\n");
buffer.append("<!DOCTYPE MyRootElement ");
buffer.append("[<!ENTITY data SYSTEM \"file:///");
buffer.append(path);
buffer.append("\">]>\n");
buffer.append("<MyRootElement xmlns:...>\n");
buffer.append("&data;\n");
buffer.append("</MyRootElement>\n");
InputSource source = new InputSource(new StringReader(buffer.toString()));
xmlReader.parse(source);
Я проверил вышеизложенное, сохранив часть java. io.Reader
выводит в файл, и он работает. Однако этот подход не применим в моем случае, и такая дополнительная информация (заголовок XML, корневой элемент) не может быть b e вставлен, поскольку объект java.io.Reader
, переданный моему коду, уже создан.
По сути,Я ищу «фрагментированный разбор XML». Итак, мой вопрос: можно ли это сделать, используя стандартные API Java (включая пакеты org.sax.xml. *
и java.xml. *
)?