A la hora de trabajar con servicios REST o SOAP, en algunos casos, la comunicación que se da entre los servicios puede ser en un formato en específico, en este caso, vamos a hablar acerca de como al recibir un XML lo podemos procesar, y así obtener el valor de cada etiqueta según lo necesitemos.

Primeramente para este laboratorio vamos a necesitar importar los siguientes paquetes a nuestra clase:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Entity;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import java.io.File;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringReader;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.InputSource;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

En este caso, el XML viene en un formato String de la siguiente forma:

Para procesarlo usaremos el siguiente código:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml))); 
Element formato = document.getDocumentElement();

Lo que hacemos es leer el string xml y convertirlo a un documento XML en el cual podamos leer cada etiqueta de forma individual, al final cuando tengamos nuestro documento formateado le aplicaremos una función para extraer los valores.

Crearemos una función que recorra el XML y nos devuelva el valor entre las etiquetas según se necesite:

private String getValueTag(String tagName, Element element) { 
  String res = "";
  NodeList list = element.getElementsByTagName(tagName);
    if (list != null && list.getLength() > 0) {
    NodeList subList = list.item(0).getChildNodes();
        if (subList != null && subList.getLength() > 0) { 
        res = subList.item(0).getNodeValue();
        }
    } 
    if(res.equals("")){
       res = "Etiqueta no encontrada";
       } 
    return res;
}

Por último para obtener el valor de la etiqueta del xml usaremos el siguiente código:

String codigo = getValueTag("codigo",formato);
String mensaje = getValueTag("mensaje",formato);

System.out.println("Código: " + codigo);
System.out.println("Mensaje: " + mensaje);

De esta manera la impresión sería:

Código: 0
Mensaje: Prueba XML

Les dejo la clase completa:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Entity;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import java.io.File;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringReader;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.InputSource;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class PrintXML{

     private String getValueTag(String tagName, Element element) {
                String res = "";
                NodeList list = element.getElementsByTagName(tagName);
                if (list != null && list.getLength() > 0) {
                    NodeList subList = list.item(0).getChildNodes();

                    if (subList != null && subList.getLength() > 0) {
                        res = subList.item(0).getNodeValue();
                    }
                }

                if(res.equals("")){
                    res = "Etiqueta no encontrada";
                    }

                return res;
            }
    

     public static void main(String []args){
        
        String xml =  "<!--?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?-->\n" + 
                      "<resultado>\n" + 
                      "    <codigo>0</codigo>\n" + 
                      "    <mensaje>Prueba XML</mensaje>\n" + 
                      "</resultado>";

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder builder = factory.newDocumentBuilder(); 
        Document document = builder.parse(new InputSource(new StringReader(xml))); 
        Element formato = document.getDocumentElement();
        
        String codigo = getValueTag("codigo",formato);
        String mensaje = getValueTag("mensaje",formato);
        
        System.out.println("Código: " + codigo);
        System.out.println("Mensaje: " + mensaje);
        
        
     }
     
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *