Tengo un archivo XML que lo llamo (xyz.xml) con datos de muestra, ver a continuación:

Quiero leer del archivo (xyz.xml) y actualizar los valores en el mismo archivo xml.

Nota (Tengo variables que contendrán datos para usar en la actualización del archivo xml)

Breve descripción de mi escenario [Leeré primero los valores de un archivo XML diferente y los almacenaré en variables. Luego usaré las variables para actualizar el segundo archivo xml que es (xyz.zml)

¿Cómo puedo lograr esto en Java (Escribir en el archivo XML (xyz.xml)) incluso si utilizo un enfoque diferente?

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
   <string key="ankomstDato">2019-06-03T09:24:40.486</string>
   <boolean key="samletUsrHoey">true</boolean>
   <array key="driftsform">
      <string>string_value</string>
   </array>
   <number key="versjon">0</number>
</map>

Mi código de muestra de Java, pero obtengo

Excepción en el hilo "main" java.lang.NullPointerException en no.difi.oauth2.utils.SolutionXML2XmlFormat.Write2XMLfile (SolutionXML2XmlFormat.java:68)

import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
//** */

public class SolutionXML2XmlFormat {
    //Create Public Variables to store data
    //**
    public static String ankomstDato_value;
    public static String art_value;
        
    //+++

    public void Xml2JavaObject(String TheXMLPath){
        //read the xml(TheXMLPath) and store values in variables

        //This is just an example
        ankomstDato_value = "2022-08-03T09:24:40.486";
                   
        //Call method to write values
        Write2XMLfile();
    }
    
    //Modify the existing values in Api_XML_Format.xml
    //*
    public void Write2XMLfile(){
        try {
            String filepath = "src/main/java/no/difi/oauth2/utils/Api_XML_Format.xml";
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.parse(filepath);
    
            // Get the root element , this case its "map"
            Node map = doc.getFirstChild();

            //1. ankomstDato
            Node ankomstDato = doc.getElementsByTagName("ankomstDato").item(0);
            ankomstDato.setTextContent(ankomstDato_value);
            //End ankomstDato
            
            //2. art
            //Node art = doc.getElementsByTagName("art").item(0);
            //art.setTextContent(art_value);
            //End art

            // write the content into xml file
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File(filepath));
            transformer.transform(source, result);
    
            System.out.println("Done Update The Api_XML_Format.xml");
    
           } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
           } catch (TransformerException tfe) {
            tfe.printStackTrace();
           } catch (IOException ioe) {
            ioe.printStackTrace();
           } catch (SAXException sae) {
            sae.printStackTrace();
        }
    }


    
}
0
Kevin Mbugua 25 jun. 2020 a las 16:04

2 respuestas

Cambia tu código a:

//1. ankomstDato
if(doc.getElementsByTagName("ankomstDato") != null){
     Node ankomstDato = doc.getElementsByTagName("ankomstDato").item(0);
     ankomstDato.setTextContent(ankomstDato_value);
}
//End ankomstDato

Haga esto para todos y cada uno de los elementos del documento mientras asigna esos datos.

-1
Ashish Karn 25 jun. 2020 a las 13:56

Recuerde incluir cuál es realmente su problema.

Sin embargo, espero que se encuentre con un NullPointerException ya que Node ankomstDato = doc.getElementsByTagName("ankomstDato").item(0); no encuentra nada y por lo tanto devuelve null.

El "nombre de etiqueta" al que hace referencia no es en realidad lo que parece querer hacer coincidir; En este caso, los nombres de las etiquetas son "cadena", "mapa", "booleano", "matriz" o "número". Lo que intenta encontrar es el nodo donde su atributo "clave" tiene el valor "ankomstDato".

Recomiendo usar XPath en su lugar para seleccionar el elemento que desee. Aquí hay un ejemplo para reemplazar su método Write2XMLfile:

public void Write2XMLfile() {
    XPathFactory xpathFact = XPathFactory.newInstance();
    XPath xpath = xpathFact.newXPath();

    try {
        String filepath = "C:\\Users\\scsmi\\Desktop\\test.xml";
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(filepath);

        // 1. ankomstDato
        Node ankomstDato = (Node) xpath.evaluate("(/map/string[@key='ankomstDato'])[1]", doc,
                XPathConstants.NODE);
        ankomstDato.setTextContent(ankomstDato_value );
        // End ankomstDato

        // 2. art
        // Node art = doc.getElementsByTagName("art").item(0);
        // art.setTextContent(art_value);
        // End art

        // 3. array
        NodeList arrayElements = (NodeList) xpath.evaluate("/map/array[@key='driftsform']/*", doc,
                XPathConstants.NODESET);
        for (int i = 0; i < arrayElements.getLength(); i++) {
            Node el = arrayElements.item(i);
            System.out.println("array element: tag='" + el.getNodeName() + "' text='"
                    + el.getTextContent() + "'");
        }
        // end array

        // write the content into xml file
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File(filepath));
        transformer.transform(source, result);

        System.out.println("Done Update The Api_XML_Format.xml");

    } catch (ParserConfigurationException pce) {
        pce.printStackTrace();
    } catch (TransformerException tfe) {
        tfe.printStackTrace();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    } catch (SAXException sae) {
        sae.printStackTrace();
    } catch (XPathExpressionException xee) {
        xee.printStackTrace();
    }
}
1
xtratic 25 jun. 2020 a las 13:58