2009-01-27 8 views
7

Estoy analizando un archivo XML en Java utilizando el W3C DOM. Estoy atascado en un problema específico, no puedo encontrar la forma de obtener todo el XML interno de un nodo.Java/DOM: Obtenga el contenido XML de un nodo

El nodo se ve así:

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

Qué función tengo que utilizar para conseguir que:

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

+0

[Este mensaje el SO puede ayudar a obtener el XML interna de un nodo] [1] [ 1]: http://stackoverflow.com/questions/7910474/how-to-get-node-contents-from-jdom – JeeZ

Respuesta

3

Tienes que utilizar la API de transformar/XSLT utilizando el nodo <b> como el nodo a transformar y poner el resultado en un nuevo StreamResult (new StringWriter()); . Consulte how-to-pretty-print-xml-from-java

0

er ... también puede llamar a String() y simplemente cortar las etiquetas de inicio y final, ya sea manualmente o utilizando expresiones regulares.

editar: toString() no hace lo que esperaba. Al sacar el O'Reilly Java & XML book se habla sobre el módulo Cargar y Guardar de Java DOM.

Consulte en particular el LSSerializer que parece muy prometedor. Podría llamar a writeToString (nodo) y cortar las etiquetas de inicio y final, como sugerí, o tratar de usar LSSerializerFilter para no imprimir las etiquetas de los nodos superiores (no estoy seguro de si eso funcionaría; admito que nunca he usado LSSerializer antes .)

Leyendo el libro de O'Reilly parece indicar hacer algo como esto:

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

No? .toString() de mi td-Node daría como resultado "[b: null]" –

+0

Hmm, creo que confundí con Javascript + e4x. Quise decir llamar a la función que acaba de producir el resultado, luego eliminar las etiquetas de inicio/finalización. –

0

node.getTextContent();

Debería estar usando JDom of Dom4J para manejar nodos, por ningún otro motivo, para manejar espacios en blanco correctamente.

0

Para quitar las etiquetas unneccesary probable que dicho código se puede utilizar:

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

Pero no siempre funciona, porque "canónica forma = true" es opcional

4

Sé que esto se le preguntó hace mucho tiempo pero para la próxima persona que busca (yo estaba en la actualidad), esto funciona con JDOM:

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

Pasa una lista de todos los nodos secundarios a outputString, que los serializará en orden.

1

¿Qué dice usted acerca de esto? que tenía el mismo problema hoy en android, pero me las arreglé para hacer simple "serializator"

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; 
    } 
Cuestiones relacionadas