Эффективный способ преобразования содержимого нескольких узлов каналов

StackOverflow https://stackoverflow.com/questions/921558

Вопрос

  • Мне нужно "проксировать" канал
  • и оставьте большую часть узлов нетронутыми
  • и преобразуйте содержимое нескольких известных узлов, вызвав некоторые методы java
  • и верните преобразованный канал

Конечно, я предпочитаю избегать - загрузки в память всего канала - преобразования других узлов - плохая производительность

Это своего рода java - канал !

Спасибо за ваши рекомендации

Это было полезно?

Решение

Это то, чем я пользуюсь:

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.dom.DOMResult;
import org.w3c.dom.Document;
...
TransformerFactory mTransformFactory = TransformerFactory.newInstance();
cTransformer = mTransformFactory.newTransformer(new StreamSource(new StringReader(StringUtil.readFromResource("/foo.xslt"))));
Document mResultDoc = XmlUtil.createDocument();
Document mResultDoc = XmlUtil.parseXmlFile("foo.xml");
transformer.transform(new DOMSource(source), new DOMResult(mResultDoc));

Поскольку вы хотите избежать накладных расходов на память, вам следует заменить использование DOMSource и DOMResult эквивалентами SAX.Использование класса String и XML util должно быть очевидно из контекста.

Другие советы

Ну, я не знаю насчет "не загружаться в память", но если вы хотите преобразовать xml, вам следует рассмотреть xslt и xpath - путь.

Спасибо всем за ваши ответы :Вот окончательный результат

TransformerFactory tFactory = TransformerFactory.newInstance();
InputStream xslt = FeedSecurityException.class.getResourceAsStream("/filter.xslt");
Transformer transformer = tFactory.newTransformer(new StreamSource(xslt));
transformer.transform(new StreamSource(input), new StreamResult(ouput));

И XSLT, который вызывает метод java для своего рода узла и оставляет остальные нетронутыми

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java">


<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />


<xsl:template match="CHANGED_NODE">
    <xsl:element name="CHANGED_NODE">
        <xsl:value-of select="java:com.mypackage.MyClass.tranformContent(.)"/>
   </xsl:element>
</xsl:template>

<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>

</xsl:stylesheet>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top