[英]XPath assign values to Child of Nodelist from an XML - Java
I have an XML that uses Map*, see below.我有一个使用 Map* 的 XML,见下文。 I want to assign some values to an array (usrHoey).我想为数组(usrHoey)分配一些值。
example.例子。
Assign "String_2" to Variable kode将“String_2”分配给变量kode
Assign 2 to Variable prosentsats将 2 分配给变量prosentsats
How do I accomplish this in java using XPath.如何使用 XPath 在 java 中完成此操作。 See below java code, area to look at is "// usrHoey ************************* ".参见下面的 java 代码,查看区域为“// usrHoey *************************”。 The previous variable "ankomstDato" work fine.以前的变量“ankomstDato”工作正常。
XML file(xyx.xml) 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 code that is working well will other simple Nodes.运行良好的 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();
}
}
}
This is how I did it, it might not be the correct method but it worked for me.我就是这样做的,它可能不是正确的方法,但它对我有用。 I still stand to be corrected by anyone with a better method.我仍然可以被任何有更好方法的人纠正。
//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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.