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

凯文·姆布瓜(Kevin Mbugua):

我有一个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代码,但我得到了

线程“主”中的异常java.lang.NullPointerException,位于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();
        }
    }


    
}
Xtratic:

请记住包括您的问题实际上是什么。

但是,我希望您遇到了什么,NullPointerException因为Node ankomstDato = doc.getElementsByTagName("ankomstDato").item(0);找不到任何内容,因此返回null

它所指的“标签名称”实际上并不是您想要匹配的名称;在这种情况下,标签名称为“字符串”,“映射”,“布尔值”,“数组”或“数字”。您要查找的是其属性“键”的值为“ ankomstDato”的节点。

我建议改用XPath选择所需的元素。这是替换您的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();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Java中更新xml文件

如何在Hibernate XML中使用关联映射java.util.Map?

如何使用python beautifulsoup更新xml文件

如何使用xmlstarlet更新xml文件

如何使用C#更新xml文件

如何使用PHP更新xml文件?

如何在Java中使用“打开和结束标签不匹配”解析XML文件

如何使用XPath和Java更新XML

如何在Java文件中使用库

在Java中使用Xpath更新Xml标签的值

在Java中使用文件作为大型Map的存储介质

如何在 JOOQ 中使用 java Map<String,Object> 生成插入和更新 sql 查询(不生成代码)?

如何使用java监听JSON文件更新

如何在Rust中使用动态属性更新Yaml文件?

无法在Spring Java配置中使用ClassPathResource找到xml文件

XML验证无法在Java中使用schemaLocation本地文件

如何使用Java代码在资产中动态创建JSON文件或如何在Android中使用Java代码更新现有的JSON文件

如何使用Java从XML文件获取属性

如何使用Java读取XML文件?

如何在 MockClientHttpRequest/Response 中使用 RestTemplate xml 文件

如何在Python中使用XSLT转换XML文件?

如何在大xml文件中使用php?

如何在node.js中使用xml文件?

如何在.properties或xml文件中使用环境变量

如何在 Ruby 中使用 Post 请求发送 XML 文件

如何转换XML文件以在Rails应用程序中使用?

如何在SVG文件中使用XML标记

如何在单独的XML文件中使用骆驼路线

更改了Activity Java文件的名称,如何更新xml引用?