簡體   English   中英

如何更新在 Java 中使用 MAP 的 XML 文件

[英]How to update an XML file that uses MAP in Java

我有一個 XML 文件調用它(xyz.xml),示例數據見下文:

我想從文件(xyz.xml)中讀取並更新同一個 xml 文件中的值。

注意(我有將包含用於更新 xml 文件的數據的變量)

我的場景的簡要描述[我將首先從不同的 XML 文件中讀取值並將它們存儲在變量中。 然后我將使用變量來更新第二個 xml 文件,即 (xyz.zml)

即使使用不同的方法,我如何在 Java(寫入 XML 文件(xyz.xml))中完成此操作?

<?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>

我的示例 java 代碼,但我得到

no.difi.oauth2.utils.SolutionXML2XmlFormat.Write2XMLfile(SolutionXML2XmlFormat.java:68)的線程“主”java.lang.NullPointerException 中的異常

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();
        }
    }


    
}

請記住包括您的問題實際上是什么..

但是,我希望您遇到NullPointerException ,因為Node ankomstDato = doc.getElementsByTagName("ankomstDato").item(0); 找不到任何東西,所以它返回null

它所指的“標簽名稱”實際上並不是您想要匹配的; 在這種情況下,標簽名稱是“string”、“map”、“boolean”、“array”或“number”。 您要查找的是其屬性“key”具有值“ankomstDato”的節點。

我建議使用 XPath 代替 select 您想要的元素。 這是替換您的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. ankomstDato
if(doc.getElementsByTagName("ankomstDato") != null){
     Node ankomstDato = doc.getElementsByTagName("ankomstDato").item(0);
     ankomstDato.setTextContent(ankomstDato_value);
}
//End ankomstDato

在映射該數據時對文檔的每個元素執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM