2011-08-10 6 views
2

Compte tenu xml comme ceci:Sélection du texte brut xml

<container> 
    <item> 
     <xmlText> 
      <someTag>   
       <otherTag> 
        Text 
       </otherTag> 
      </someTag> 
     </xmlText> 
    </item> 
<container> 

Je voudrais tout sélectionner texte qui est sous le point/xmlText. Je voudrais imprimer tout le contenu de ce noeud avec des étiquettes (someTag, otherTag).

Je préférerais gérer cela avec XPath, mais cela fait partie du programme Java, donc s'il y a un tel mécanisme, je pourrais le prendre aussi bien.

+0

Bonne question, +1. Voir ma réponse pour une solution XSLT courte et facile. :) –

Répondre

0

Utilisez XSLT pour cette:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="/container/item/xmlText/node()"/> 
</xsl:template> 
</xsl:stylesheet> 

Lorsque cela est appliqué sur le document XML fourni (corrigé pour être bien formé !!!):

<container> 
    <item> 
     <xmlText> 
      <someTag> 
       <otherTag> 
       Text 
       </otherTag> 
      </someTag> 
     </xmlText> 
    </item> 
</container> 

la recherché, correcte re sult est produit:

<someTag> 
    <otherTag> 
       Text 
       </otherTag> 
</someTag> 
0

Lorsque cela est votre élément récupéré avec XPath

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 

Element element = (Element) xpath.evaluate(
    "/container/item/xmlText", document, XPathConstants.NODE); 

Ensuite, vous pouvez faire quelque chose le long de ces lignes:

java.io.ByteArrayOutputStream data = 
    new java.io.ByteArrayOutputStream(); 
java.io.PrintStream ps = new java.io.PrintStream(data); 

// These classes are part of Xerces. But you will find them in your JDK, 
// as well, in a different package. Use any encoding here: 
org.apache.xml.serialize.OutputFormat of = 
    new org.apache.xml.serialize.OutputFormat("XML", "ISO-8859-1", true); 
org.apache.xml.serialize.XMLSerializer serializer = 
    new org.apache.xml.serialize.XMLSerializer(ps, of); 

// Here, serialize the element that you obtained using your XPath expression. 
serializer.asDOMSerializer(); 
serializer.serialize(element); 

// The output stream now holds serialized XML data, including tags/attributes... 
return data.toString(); 

MISE À JOUR

Ce serait plus concis, plutôt que d'utiliser les internes Xerces. Il est le même que la solution de Dimitre, mais pas avec une feuille de style XSLT mais en Java:

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

cela marque beaucoup de méthodes et de classes dépréciées, n'est-ce pas mieux? –

+0

Qu'est-ce qui est déprécié? Avec Xerces 2.7.1 (pas le dernier), et Java 6, je ne vois aucune dépréciation ici –

+0

ces classes sont obsolètes sur mon instance: import org.apache.xml.serialize.OutputFormat; import org.apache.xml.serialize.XMLSerializer; –

Questions connexes