Эффективный способ преобразования содержимого нескольких узлов каналов
Вопрос
- Мне нужно "проксировать" канал
- и оставьте большую часть узлов нетронутыми
- и преобразуйте содержимое нескольких известных узлов, вызвав некоторые методы 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>
Не связан с StackOverflow