Мне нужно разобрать непрерывный поток хорошо сформированных 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, корневой элемент) не может быть вставлена, поскольку объект java.io.Reader
, переданный моему коду, уже сконструирован.
По сути, я ищу "фрагментированный разбор XML". Итак, мой вопрос: может ли это быть сделано, используя стандартные API Java (включая пакеты org.sax.xml.*
и java.xml.*
)?