XPath 将值从 XML - Java 分配给节点列表的子级



我有一个使用 Map* 的 XML,见下文。我想为数组(usrHoey(分配一些值。

例。

将"String_2"分配给变量kode

将 2 分配给可变prosentsats

我如何使用XPath在java中完成此操作。请参阅下面的java代码,要查看的区域是"//usrHoey ****以前的变量"ankomstDato"工作正常。

XML 文件(xyx.xml(

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<string key="ankomstDato">2020-08-03T09:24:40.486</string>
<map key="historikk">
<array key="usrHoey">
<map>
<string key="kode">string</string>
<number key="prosentsats">0</number>
</map>
</array>          
</map>
</map>

运行良好的Java代码将其他简单的节点。

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 javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
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; //1
//+++
public void Xml2JavaObject(String TheXMLPath){
//read the xml(TheXMLPath) and store values in variables
//This is just an example
ankomstDato_value = "2021-08-03T09:24:40.486";

//Call method to write values
Write2XMLfile();
}

//Modify the existing values in Api_XML_Format.xml
//*
public void Write2XMLfile(){
XPathFactory xpathFact = XPathFactory.newInstance();
XPath xpath = xpathFact.newXPath();
try {
String filepath = "src/main/java/no/difi/oauth2/utils/xyz.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
// usrHoey **************************
NodeList arrayElements_4 = (NodeList) xpath.evaluate("/map/map/array[@key='usrHoey']/*", doc, XPathConstants.NODESET);
for (int i = 0; i < arrayElements_4.getLength(); i++) {
Node el = arrayElements_4.item(i);
el.setTextContent(pmAnmerkningListe_value[i]);
System.out.println("n n");
System.out.println("array element: tag='" + el.getNodeName() + "' text='"
+ el.getTextContent() + "'");
}
// usrHoey


//********** */
//End of historikk

// 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 Updating The xyz.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();
}

}


}

这就是我的做法,它可能不是正确的方法,但它对我有用。我仍然愿意被任何有更好方法的人纠正。

//11.  usrHoey **************************
Node usrHoey = (Node) xpath.evaluate("/map/map/array[@key='usrHoey']/*", doc, XPathConstants.NODE);
if(null != usrHoey) {
NodeList nodeList = usrHoey.getChildNodes();
for (int i = 0;null!=nodeList && i < nodeList.getLength(); i++) {
Node nod = nodeList.item(i);
System.out.println("n");
if(nod.getNodeType() == Node.ELEMENT_NODE){
NodeList arrayElements_11 = (NodeList) xpath.evaluate("/map/map/array[@key='usrHoey']/*", doc, XPathConstants.NODESET);
for (int j = 0; j < arrayElements_11.getLength(); j++) {
//11.  Kode
Node kode = (Node) xpath.evaluate("(/map/map/array/map/string[@key='kode'])[1]", doc, XPathConstants.NODE);
kode.setTextContent(usrHoey_kode_value[j]);
// end kode
//12.  prosentsats
Node prosentsats = (Node) xpath.evaluate("(/map/map/array/map/string[@key='prosentsats'])[1]", doc, XPathConstants.NODE);
prosentsats.setTextContent(usrHoey_prosentsats_value[j]);
// end prosentsats                           
}

}

}
}
// usrHoey

相关内容

最新更新