Domanda

  • Ho bisogno di "proxy" di un feed
  • e lasciare la maggior parte dei nodi incontaminata
  • e di trasformare il contenuto di alcuni noti nodi chiamando alcuni dei metodi in java
  • e tornare la trasformata di alimentazione

Naturalmente preferisco evitare - il caricamento in memoria l'intero feed - trasformare altri nodi - le cattive prestazioni

E ' una sorta di java tubo !

Grazie per i vostri consigli

È stato utile?

Soluzione

Questo è qualcosa che io uso:

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

Dal momento che si vuole evitare il sovraccarico di memoria si dovrebbe sostituire il DOMSource e DOMResult utilizzo con SAX equivalenti.La Stringa XML e util uso di questa classe dovrebbe essere evidente dal contesto.

Altri suggerimenti

Beh, io non so il "caricamento in memoria", ma se si vuole trasformare xml si dovrebbe prendere in considerazione xslt e xpath.

Grazie a tutti per le vostre risposte :Ecco il risultato finale

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

E XSLT che chiamare il metodo java per un tipo di nodo e lasciare gli altri incontaminata

<?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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top