2010-07-21 5 views

risposta

6

Non esiste un metodo semplice su org.w3c.dom.Node per questo. getTextContent() fornisce il testo di ciascun nodo figlio concatenato insieme. getNodeValue() ti darà il testo del nodo corrente se è un nodo Attributo, CDATA o Testo. Quindi è necessario serializzare il nodo utilizzando una combinazione di getChildNodes(), getNodeName() e getNodeValue() per creare la stringa.

È anche possibile farlo con una delle varie librerie di serializzazione XML esistenti. C'è XStream o anche JAXB. Questo è discusso in XML serialization in Java?

36

Stesso problema. Per risolverlo ho scritto questa funzione di supporto:

public String innerXml(Node node) { 
    DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0"); 
    LSSerializer lsSerializer = lsImpl.createLSSerializer(); 
    NodeList childNodes = node.getChildNodes(); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < childNodes.getLength(); i++) { 
     sb.append(lsSerializer.writeToString(childNodes.item(i))); 
    } 
    return sb.toString(); 
} 
+0

grazie, esattamente quello che mi serviva – yossi

+0

Questo metodo continua ad aggiungere il tag di definizione XML nella parte anteriore della stringa ... c'è un modo per prevenire che, oltre a limitarsi semplicemente a tagliare in seguito? – Nyerguds

+16

L'ho risolto.La soluzione è aggiungere la riga 'lsSerializer.getDomConfig(). SetParameter (" xml-declaration ", false);' – Nyerguds

2

se non volete ricorrere a librerie esterne, la seguente soluzione potrebbe rivelarsi utile. Se si dispone di un nodo "" e si desidera estrarre il childre dell'elemento genitore procedere come segue:

StringBuilder resultBuilder = new StringBuilder(); 
    // Get all children of the given parent node 
    NodeList children = parent.getChildNodes(); 
    try { 

     // Set up the output transformer 
     TransformerFactory transfac = TransformerFactory.newInstance(); 
     Transformer trans = transfac.newTransformer(); 
     trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     trans.setOutputProperty(OutputKeys.INDENT, "yes"); 
     StringWriter stringWriter = new StringWriter(); 
     StreamResult streamResult = new StreamResult(stringWriter); 

     for (int index = 0; index < children.getLength(); index++) { 
      Node child = children.item(index); 

      // Print the DOM node 
      DOMSource source = new DOMSource(child); 
      trans.transform(source, streamResult); 
      // Append child to end result 
      resultBuilder.append(stringWriter.toString()); 
     } 
    } catch (TransformerException e) { 
     //Errro handling goes here 
    } 
    return resultBuilder.toString(); 
4

Se stai usando jOOX, si può avvolgere il nodo in una sintassi jquery -come e basta chiamare toString() su di esso:

$(node).toString(); 

esso utilizza un'identità trasformatore interno, in questo modo:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
Source source = new DOMSource(element); 
Result target = new StreamResult(out); 
transformer.transform(source, target); 
return out.toString(); 
0

Basandosi sulla cima della soluzione di Lukas Eder, possiamo estrarre InnerXml come in .NET, come di seguito

public static String innerXml(Node node,String tag){ 
     String xmlstring = toString(node); 
     xmlstring = xmlstring.replaceFirst("<[/]?"+tag+">",""); 
     return xmlstring;  

}

public static String toString(Node node){  
    String xmlString = ""; 
    Transformer transformer; 
    try { 
     transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     //transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     StreamResult result = new StreamResult(new StringWriter()); 

     xmlString = nodeToStream(node, transformer, result); 

    } catch (TransformerConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TransformerFactoryConfigurationError e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TransformerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }catch (Exception ex){ 
     ex.printStackTrace(); 
    } 

    return xmlString;    
} 

Es:

If Node name points to xml with string representation "<Name><em>Chris</em>tian<em>Bale</em></Name>" 
String innerXml = innerXml(name,"Name"); //returns "<em>Chris</em>tian<em>Bale</em>" 
1

ho avuto il problema con l'ultima risposta che il metodo 'nodeToStream()' non è definito; quindi, la mia versione qui:

public static String toString(Node node){ 
    String xmlString = ""; 
    try { 
     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     //transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

     Source source = new DOMSource(node); 

     StringWriter sw = new StringWriter(); 
     StreamResult result = new StreamResult(sw); 

     transformer.transform(source, result); 
     xmlString = sw.toString(); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    return xmlString; 
} 
3

Estendendo la risposta di Andrey M, ho dovuto modificare leggermente il codice per ottenere il documento DOM completo. Se si utilizza semplicemente il

NodeList childNodes = node.getChildNodes(); 

Non ha incluso l'elemento radice per me. Per includere l'elemento radice (e ottenere il documento .xml completo) che ho usato:

public String innerXml(Node node) { 
    DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0"); 
    LSSerializer lsSerializer = lsImpl.createLSSerializer(); 
    lsSerializer.getDomConfig().setParameter("xml-declaration", false); 
    StringBuilder sb = new StringBuilder(); 
    sb.append(lsSerializer.writeToString(node)); 
    return sb.toString(); 
} 
0

Ecco una soluzione alternativa per estrarre il contenuto di un org.w3c.dom.Node. Questa soluzione funziona anche se il contenuto del nodo non contiene i tag XML:

private static String innerXml(Node node) throws TransformerFactoryConfigurationError, TransformerException { 
    StringWriter writer = new StringWriter(); 
    String xml = null; 
    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    transformer.transform(new DOMSource(node), new StreamResult(writer)); 
    // now remove the outer tag.... 
    xml = writer.toString(); 
    xml = xml.substring(xml.indexOf(">") + 1, xml.lastIndexOf("</")); 
    return xml; 
} 
Problemi correlati