2010-12-10 5 views
28

je suis tombé sur ce morceau de fonction Java pour convertir un noeud XML à une représentation String Java:XML Noeud à chaîne en Java

private String nodeToString(Node node) { 
StringWriter sw = new StringWriter(); 
try { 
Transformer t = TransformerFactory.newInstance().newTransformer(); 
t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
t.setOutputProperty(OutputKeys.INDENT, "yes"); 
t.transform(new DOMSource(node), new StreamResult(sw)); 
} catch (TransformerException te) { 
System.out.println("nodeToString Transformer Exception"); 
} 
return sw.toString(); 
} 

Il semble simple en ce qu'elle veut la chaîne de sortie n'a pas Déclaration XML et doit contenir une indentation.

Mais je me demande comment la production réelle devrait être, supposons que j'ai un noeud XML:

<p><media type="audio" id="au008093" rights="wbowned"> 
<title>Bee buzz</title> 
</media>Most other kinds of bees live alone instead of in a colony. These bees make 
     tunnels in wood or in the ground. The queen makes her own nest.</p> 

ce que je pourrais assumer la chaîne résultante après application de la transformation ci-dessus est:

"media type="audio" id="au008093" rights="wbowned" title Bee buzz title /media" 

Je veux pour tester moi-même, mais je n'ai aucune idée sur la façon de représenter ce nœud XML de la façon dont cette fonction veut réellement.

Je suis un peu confus, et merci d'avance pour l'aide généreuse.

Répondre

13

Vous disposez d'une représentation XML dans une arborescence DOM.
Par exemple, vous avez ouvert un fichier XML et vous l'avez transmis dans l'analyseur DOM.
Par conséquent, un arbre DOM en mémoire avec votre XML est créé.
Vous pouvez désormais accéder aux informations XML uniquement via la traversée de l'arborescence DOM.
Si vous avez besoin cependant, une représentation de chaîne de l'information XML de l'arbre DOM vous utilisez une transformation.
Cela se produit car il n'est pas possible d'obtenir la représentation String directement à partir d'une arborescence DOM.
Ainsi, si par exemple Node node vous transmettez nodeToString est l'élément racine du document XML, le résultat est une chaîne contenant les données XML d'origine.
Les étiquettes seront toujours là. C'est à dire. vous aurez une représentation XML valide. Seulement cette fois sera dans une variable String.

Par exemple:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder parser = factory.newDocumentBuilder(); 
    Document xmlDoc = parser.parse(file);//file has the xml 
    String xml = nodeToString(xmlDoc.getDocumentElement());//pass in the root 
    //xml has the xml info. E.g no xml declaration. Add it 
    xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?> + xml;//bad to append this way... 
    System.out.println("XML is:"+xml); 

AVERTISSEMENT: n'a même pas essayé de compiler le code. Espérons que vous comprenez ce que vous avez à faire

31

Tout l'important a déjà été dit. J'ai essayé de compiler le code suivant.

 

import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.io.StringWriter; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 

public class Test { 

    public static void main(String[] args) throws Exception { 

    String s = 
     "<p>" + 
     " <media type=\"audio\" id=\"au008093\" rights=\"wbowned\">" + 
     " <title>Bee buzz</title>" + 
     " " + 
     " Most other kinds of bees live alone instead of in a colony." + 
     " These bees make tunnels in wood or in the ground." + 
     " The queen makes her own nest." + 
     "</p>"; 
    InputStream is = new ByteArrayInputStream(s.getBytes()); 

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document d = db.parse(is); 

    Node rootElement = d.getDocumentElement(); 
    System.out.println(nodeToString(rootElement)); 

    } 

    private static String nodeToString(Node node) { 
    StringWriter sw = new StringWriter(); 
    try { 
     Transformer t = TransformerFactory.newInstance().newTransformer(); 
     t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     t.setOutputProperty(OutputKeys.INDENT, "yes"); 
     t.transform(new DOMSource(node), new StreamResult(sw)); 
    } catch (TransformerException te) { 
     System.out.println("nodeToString Transformer Exception"); 
    } 
    return sw.toString(); 
    } 

} 
 

Et il produit la sortie suivante:

 

<p> <media id="au008093" rights="wbowned" type="audio"> <title>Bee buzz</title> </media> Most other kinds of bees live alone instead of in a colony. These bees make tunnels in wood or in the ground. The queen makes her own nest.</p> 
 

Vous pouvez encore modifier par vous-même. Bonne chance!

+0

Pour le lecteur occasionnel, une version modifiée est ici: http://stackoverflow.com/a/33936257/363573 – Stephan