简体   繁体   English

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM