Мне нужно проанализировать непрерывный поток правильно сформированных элементов 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.*
)?