2009-05-28 13 views
0
  • J'ai besoin de « proxy » un flux
  • et laisser la plupart des nœuds vierges
  • et de transformer le contenu de quelques noeuds connus en appelant des méthodes java
  • et retourner l'alimentation

transformé Bien sûr, je préfère éviter - charger en mémoire la totalité de la charge - transformer d'autres nœuds - mauvaises performancesmoyen efficace de transformer quelques noeuds contenu des flux

C'est une sorte de tuyau java!

Merci pour vos recommandations

Répondre

0

C'est quelque chose que j'utilise:

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)); 

Puisque vous voulez éviter la mémoire au-dessus, vous devez remplacer l'utilisation DOMSource et DOMResult avec des équivalents SAX. L'utilisation de la classe String et XML util doit être évidente à partir du contexte.

0

Eh bien, je ne sais pas au sujet de la « ne se charge pas en mémoire » mais si vous voulez transformer xml vous devriez considérer xslt et xpath.

0

Merci à tous pour vos réponses: Voici le résultat final

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)); 

Et le XSLT qui appelle la méthode java pour une sorte de nœud et laisser les autres intactes

<?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> 
+0

Le transformContent est bien sur une méthode statique de MyClass –