2009-01-27 12 views
7

Je suis en train d'analyser un fichier XML en Java en utilisant le DOM W3C. Je suis bloqué à un problème spécifique, je n'arrive pas à comprendre comment obtenir tout le XML interne d'un nœud.Java/DOM: Récupère le contenu XML d'un noeud

Le nœud ressemble que:

<td><b>this</b> is a <b>test</b></td>

Quelle fonction dois-je utiliser pour obtenir que:

"<b>this</b> is a <b>test</b>"

+0

[Ce message sur peut acquiescer aider à obtenir le Xml intérieur d'un noeud] [1] [ 1]: http://stackoverflow.com/questions/7910474/how-to-get-node-contents-from-jdom – JeeZ

Répondre

3

Vous devez utiliser la transformation/API xslt en utilisant votre noeud <b> comme noeud à transformer et mettre le résultat dans un nouveau StreamResult (new StringWriter()); . Voir how-to-pretty-print-xml-from-java

0

er ... vous pouvez également appeler toString() et couper simplement les balises de début et de fin, manuellement ou en utilisant des regexps.

edit: toString() ne fait pas ce que j'attendais. Extraire le O'Reilly Java & XML book parle du module Load and Save de Java DOM. Voir en particulier LSSerializer qui semble très prometteur. Vous pouvez soit appeler writeToString (noeud) et couper les balises de début et de fin, comme je l'ai suggéré, ou essayer d'utiliser LSSerializerFilter pour ne pas imprimer les balises de noeud supérieur (je ne sais pas si cela fonctionnerait, j'avoue n'avoir jamais utilisé LSSerializer avant .)

la lecture du livre O'Reilly semble indiquer de faire quelque chose comme ceci:

DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); 
DOMImplementationLS lsImpl = 
    (DOMImplementationLS)registry.getDOMImplementation("LS"); 
LSSerializer serializer = lsImpl.createLSSerializer(); 
String nodeString = serializer.writeToString(node); 
+0

Non? .toString() de mon td-Node se traduirait par "[b: null]" –

+0

Hmm, je suppose que j'ai confondu avec Javascript + e4x. Je voulais dire appeler la fonction qui produit juste la sortie, puis supprimer les balises début/fin. –

0

node.getTextContent();

Vous devez utiliser JDom de Dom4J pour gérer les nœuds, si ce n'est pour d'autres raisons, pour gérer correctement les espaces.

0

Pour supprimer les balises unneccesary probablement un tel code peut être utilisé:

DOMConfiguration config = serializer.getDomConfig(); config.setParameter ("canonical-form", true);

Mais il ne sera pas toujours travailler, parce que « forme canonique = true » est facultative

4

Je sais que cela a été demandé depuis longtemps, mais pour la personne suivante recherche (moi était aujourd'hui), cela fonctionne avec JDOM:

JDOMXPath xpath = new JDOMXPath("/td"); 
String innerXml = (new XMLOutputter()).outputString(xpath.selectNodes(document)); 

Ceci passe une liste de tous les nœuds enfants dans outputString, ce qui les sérialisera dans l'ordre.

1

Que dites-vous à ce sujet? J'ai eu aujourd'hui même problème sur Android, mais je réussi à faire « serializator » simple

private String innerXml(Node node){ 
     String s = ""; 
     NodeList childs = node.getChildNodes(); 
     for(int i = 0;i<childs.getLength();i++){ 
      s+= serializeNode(childs.item(i)); 
     } 
     return s; 
    } 

    private String serializeNode(Node node){ 
     String s = ""; 
     if(node.getNodeName().equals("#text")) return node.getTextContent(); 
     s+= "<" + node.getNodeName()+" "; 
     NamedNodeMap attributes = node.getAttributes(); 
     if(attributes!= null){ 
      for(int i = 0;i<attributes.getLength();i++){ 
       s+=attributes.item(i).getNodeName()+"=\""+attributes.item(i).getNodeValue()+"\""; 
      } 
     } 
     NodeList childs = node.getChildNodes(); 
     if(childs == null || childs.getLength() == 0){ 
      s+= "/>"; 
      return s; 
     } 
     s+=">"; 
     for(int i = 0;i<childs.getLength();i++) 
      s+=serializeNode(childs.item(i)); 
     s+= "</"+node.getNodeName()+">"; 
     return s; 
    } 
Questions connexes