[英]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.