2010-07-23 3 views
1

Avoir une application Java étendue qui effectue de nombreuses modifications, y compris la fusion de fichiers xml. Ceci est fait en utilisant des classes dom et semble fonctionner correctement. À la fin je veux formater le xml résultant afin qu'il soit plus facilement lu et stocker en tant que chaîne. J'ai commencé à faire ça avec dom aussi, mais cela limite la taille des fichiers que je peux mettre en forme.
Code actuel est:Utilisation de SAX pour exécuter une transformation sur un noeud

public String parseToString(Node node) { 
    Transformer transformer = null; 
    StringBuffer buffer = null; 
    try { 
    Transformer = TransformerFactory.newInstance().new Transformer(); 
    --- set some OutputProperties --- 
    StringWriter stringWriter = new StringWriter(512); 
    transformer.transform(new DOMSource(node), new StreamResult(stringWriter)); 
    buffer = stringWriter.getBuffer(); 
    stringWriter.close(); 
    --- catch phrases --- 
    return(buffer.toString()); 
}  

Ma compréhension est que pour utiliser SAX Je dois remplacer « nouveau DOMSource() » avec « nouvelle StreamSource() », mais pour ce faire, je dois convertir le nœud (en fait le document complet) en une chaîne. Quelle est la meilleure façon de le faire sans manger plus de mémoire?

+0

Avez-vous regardé vtd-xml? Il est beaucoup plus facile à utiliser que SAX, et vous êtes beaucoup moins susceptible de manquer de mémoire? –

Répondre

0

Qu'est-ce que vous faites réellement quand le formatage votre chemin est transformer votre XML (un nœud DOM) à l'aide d'une soi-disant transformation « identité » (c'est ce que vous obtenez d'un transformateur vide()). Le type de source que vous spécifiez (DOMSource ou StreamSource) n'a pas vraiment d'importance car XSLT a besoin de votre XML en mémoire quand même (ce qui signifie que vous finissez par construire un DOM). Il n'est tout simplement pas possible d'appliquer XSLT aux données XML en continu car votre XPath (en général) peut se déplacer comme bon lui semble dans l'arborescence des sources. Avec l'entrée SAX vous ne pouvez pas atteindre ce que vous n'avez pas regardé, et ensuite ce que vous avez regardé ne vous retient pas en mémoire ou vous devenez DOM.

Vous avez déjà votre XML en mémoire en tant que nœud DOM. La transformation d'identité est une façon d'obtenir le flux de sortie et il n'y a pas grand chose à faire sur la quantité de mémoire consommée (peut-être essayer différentes implémentations de transformateurs?). Je ne suis pas sûr non plus de l'implémentation de l'analyseur que vous avez en dessous, mais vous pouvez regarder s'il a quelque chose comme ça - http://xerces.apache.org/xerces-j/apiDocs/org/apache/xml/serialize/XMLSerializer.html. Ce type va simplement voyager dans l'arbre des éléments et les imprimer. Il ne devrait pas y avoir de surcharge de mémoire car ce qu'il fait est assez brutal. Et si vous aviez une entrée SAX, elle l'imprimerait de la même manière (c'est-à-dire sans créer de présentation en mémoire prête pour la transformation XSLT). Le seul inconvénient de cette façon est que c'est une API spécifique, qui ne fait pas partie de JAXP.

Questions connexes