Разделить XML на несколько документов в Java

1

У меня есть большое количество XML-документов, которые выглядят так:

<root xmlns="urn:foo" xmlns:bar="urn:bar">
  <Entity>
    <bar:field>Data</bar:field>
    <bar:other>Other data</bar:other>
    <bar:more>More data</bar:more>
  </Entity>
  <Entity>
    <bar:field>Data</bar:field>
    <bar:other>Other data</bar:other>
    <bar:more>More data</bar:more>
  </Entity>
</root>

До 1000 узлов Entity под каждым корневым узлом. Я хотел бы разбить каждый из них на свой собственный документ, не записывая на диск, если это возможно.

Я знаком с XSLT 2.0 и знаю, что могу выполнить это с помощью Saxon, используя xsl: result-document, но который записывает на диск во всех случаях, не так ли? Есть ли способ перехватить вывод как строку? Я работаю на Java, и исходные данные являются результатом вызова REST, поэтому он входит в качестве InputStream, который я сейчас пишу в String.

  • 0
    Напишите синтаксический анализатор SAX для интерпретации входного потока. Парсер может разбить данные на два (или более) выходных потока.
  • 0
    Кроме того, будьте очень осторожны при работе с данными XML как String / Reader. таким образом легко испортить данные.
Показать ещё 3 комментария
Теги:
xslt
xslt-2.0

3 ответа

1
Лучший ответ

Saxon 9 позволяет вам предоставить http://saxonica.com/documentation/index.html#!javadoc/net.sf.saxon.lib/OutputURIResolver файл http://saxonica.com/documentation/index.html#! javadoc/net.sf.saxon/Controller@setOutputURIResolver, который может обрабатывать любой result-document по-своему, например, путем записи в StringWriter в памяти, а не в файл на диске.

1

Как разобрать его в документе, запуская на нем выражение /root/Entity Xpath, перейдя по узлу NodeSet и приняв каждый узел в новый пустой документ?

  • 0
    Это может быть то, что я должен сделать, хотя я надеялся избежать использования ужасных XML-библиотек Java. Я надеялся, что смогу сделать это с помощью таблицы стилей.
  • 1
    Они такие же ужасные, как DOM API браузера.
0

Вы можете написать простую трансформацию XSLT 2.0 и запустить этот раз в разы по сравнению с исходным файлом из Java-программы и получить стандартный вывод Saxon в программе Java.

Как вызвать другую программу из Java: используйте ProcessBuilder и запустите Process. Детали доступны по запросу.

Другой вариант - использовать JAXB для создания дерева объектов, извлечения элементов Entity, создания небольшого дерева объектов и сортировки строки. Это было бы намного быстрее.

  • 0
    Стандартный вывод Saxon из xsl: result-document пуст, документы обычно обходят стандартный вывод и записываются в файловую систему с помощью атрибута 'href'.
  • 0
    @Derek - в этом ответе не упоминается использование xsl:result-document .
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню