转换Feed的几个节点内容的有效方法

时间:2009-05-28 15:40:46

标签: java xml xslt rss atom-feed

  • 我需要“代理”Feed
  • 并保留大部分未受破坏的节点
  • 通过调用一些java方法
  • 来转换一些已知节点的内容
  • 并返回已转换的Feed

当然我更愿意避免 - 在内存中加载整个Feed - 转换其他节点 - 表现不佳

这是一种java管道!

感谢您的推荐

3 个答案:

答案 0 :(得分:0)

我不知道“没有加载到内存中”但是如果你想要转换xml,你应该考虑 xslt xpath

答案 1 :(得分:0)

这是我使用的东西:

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类的用法应该从上下文中显而易见。

答案 2 :(得分:0)

感谢大家的回答: 这是最终结果

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>