2010-12-10 13 views
28

me encontré con este pedazo de la función de Java para convertir un nodo XML a una representación String de Java:XML para cuerdas 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(); 
} 

Parece sencillo, ya que quiere que la cadena de salida no tiene ningún Declaración XML y debe contener sangría.

Pero me pregunto cómo la salida real debería ser, supongamos que tengo un nodo 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> 

¿Podría suponer la cadena resultante después de aplicar la transformación anterior es:

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

quiero para probarlo yo mismo, pero no tengo idea de cómo representar este nodo XML de la manera que esta función realmente quiere.

Estoy un poco confundido, y gracias de antemano por la ayuda generosa.

Respuesta

13

Tiene una representación XML en un árbol DOM.
Por ejemplo, ha abierto un archivo XML y lo ha pasado en el analizador DOM.
Como resultado, se crea un árbol DOM en memoria con su XML.
Ahora solo puede acceder a la información XML a través del recorrido del árbol DOM.
Si es necesario, una representación de cadena de la información XML del árbol DOM utiliza una transformación.
Esto sucede porque no es posible obtener la representación de Cadena directamente desde un árbol DOM.
Así que si, por ejemplo, como Node node pasas en nodeToString es el elemento raíz del documento XML, entonces el resultado es una cadena que contiene los datos XML originales.
Las etiquetas seguirán allí. Es decir. usted tendrá una representación XML válida. Solo que esta vez estará en una variable String.

Por ejemplo:

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

RENUNCIA: ni siquiera intentó compilar el código. Esperemos que entienda lo que tiene que hacer

31

Todo lo importante ya se ha dicho. Traté de compilar el siguiente código.

 

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

} 
 

y produjo el siguiente resultado:

 

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

Se pueden ajustar aún más por sí mismo. ¡Buena suerte!

+0

Para el lector casual, una versión ajustada está aquí: http://stackoverflow.com/a/33936257/363573 – Stephan