Использование SAX для запуска преобразования на узле - PullRequest
1 голос
/ 23 июля 2010

Наличие расширенного Java-приложения, которое выполняет множество модификаций, включая слияние XML-файлов. Это делается с использованием классов DOM и, кажется, работает нормально. В конце я хочу отформатировать результирующий xml, чтобы его было легче читать и хранить как строку. Начал делать это и с dom, но это накладывает ограничение на размер файлов, которые я могу отформатировать.
Текущий код:

public String parseToString(Node node) {  
  Transformer transformer = null;  
  StringBuffer buffer = null;  
  try {  
    Transformer = TransformerFactory.newInstance().new Transformer();  
    --- set some OutputProperties ---  
    StringWriter stringWriter = new StringWriter(512);  
    transformer.transform(new DOMSource(node), new StreamResult(stringWriter));  
    buffer = stringWriter.getBuffer();  
    stringWriter.close();  
    --- catch phrases ---  
    return(buffer.toString());  
}    

Насколько я понимаю, для использования SAX мне нужно заменить «new DOMSource ()» на «new StreamSource ()», но для этого мне нужно преобразовать узел (фактически весь документ) в строку. Какой самый простой способ сделать это, не съедая больше памяти?

1 Ответ

0 голосов
/ 01 сентября 2010

Что вы на самом деле делаете, когда форматирование ваш путь преобразование вашего XML (узла DOM) с использованием так называемого преобразования «идентичности» (это то, что вы получаете из пустогоТрансформатор()).Какой тип источника вы укажете (DOMSource или StreamSource) на самом деле не имеет значения, так как XSLT все равно нуждается в вашем XML в памяти (что означает, что вы все равно в конечном итоге создаете DOM).Просто невозможно применить XSLT к потоковой передаче данных XML, так как ваш XPath (в общем) может блуждать в зависимости от того, какой он хочет в дереве исходных текстов.С вводом SAX вы не можете достичь того, на что вы не смотрели, и тогда то, на что вы смотрели, не сохраняется в памяти или вы становитесь DOM.

У вас уже есть XML в памяти какDOM-узелПреобразование идентичности - это один из способов получить из него выходной поток, и вы мало что можете сделать, чтобы определить, сколько памяти он будет потреблять (может быть, попробовать разные реализации преобразователя?).Я также не уверен, какая у вас реализация синтаксического анализатора, но вы можете посмотреть, есть ли у него что-то вроде этого - http://xerces.apache.org/xerces-j/apiDocs/org/apache/xml/serialize/XMLSerializer.html. Этот парень просто пройдет по дереву элементов и распечатает их.У него не должно быть лишней памяти, поскольку то, что он делает, довольно жестоко.И если бы у вас был вход SAX, он распечатал бы его таким же образом (то есть без создания презентации в памяти, готовой для преобразования XSLT).Единственное предостережение о том, чтобы идти по этому пути, это то, что это определенный API, а не часть JAXP.

...