Java 在xml中修改特定标记的值

Java 在xml中修改特定标记的值,java,xml,xml-parsing,Java,Xml,Xml Parsing,我有一个xml,如下所示 <?xml version="1.0" encoding="ISO-8859-1"?><TXNEXP FileDate="2017-05-23" FileName="/cortex/tsd/out/OPTSKRtxnexp20170523.xml" Instcode="SKR" TotNumTxns="74330"> <AUTHADV> <LOCALDATE>2017-0

我有一个xml,如下所示

<?xml version="1.0" encoding="ISO-8859-1"?><TXNEXP FileDate="2017-05-23" FileName="/cortex/tsd/out/OPTSKRtxnexp20170523.xml" Instcode="SKR" TotNumTxns="74330">              
    <AUTHADV>
        <LOCALDATE>2017-05-22</LOCALDATE>
        <LOCALTIME>200011</LOCALTIME>
        <PAN>336890380<PAN>
    </AUTHADV>
    <AUTHREV>
        <LOCALDATE>2017-05-22</LOCALDATE>
        <LOCALTIME>200011</LOCALTIME>
        <PAN>336890380<PAN>
    </AUTHREV>
    <FINAL>
        <LOCALDATE>2017-05-22</LOCALDATE>
        <LOCALTIME>200011</LOCALTIME>
        <PAN>336890380<PAN>
    </FINAL>
   </TXNEXP>
现在,我正在修改PAN标记的值并将其写回xml,但我无法对所有PAN标记都这样做

这就是我正在做的

NodeList node = doc.getElementsByTagName("TXNEXP"); 
Element emp = null;
for (int i = 0; i < node.getLength(); i++) {
  emp = (Element) node.item(i);
  Node name = emp.getElementsByTagName("PAN").item(0).getFirstChild();
          //Modifying the tag
 }
从上面的代码中,只有AUTHADV标记下的PAN被修改,其余两个值不变


如何确保所有平移标记都得到修改?

这不是最漂亮的解决方案,但在修复平移结束标记中缺少的斜杠后,这将起作用

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

class Extract {
    public static void main(String[] args) {

        try {
            File fXmlFile = new File("data.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);

            NodeList topNodes = doc.getElementsByTagName("TXNEXP");
            for (int i = 0; i < topNodes.getLength(); i++) {
                NodeList middleNodes = topNodes.item(i).getChildNodes();
                for (int j = 0; j < middleNodes.getLength(); j++) {
                    try {
                       NodeList theNodes = ((Element)middleNodes.item(j)).getElementsByTagName("PAN");
                       System.out.println(theNodes.item(0).getFirstChild().getNodeValue());
                        if (j == 1) {
                            // modify a value                                                                                                                                                               
                            theNodes.item(0).getFirstChild().setNodeValue("4567");
                            System.out.println(theNodes.item(0).getFirstChild().getNodeValue());
                        }

                    } catch (ClassCastException e) {}
                }
            }

        } catch (Exception e) {
            System.out.println(e);
        }

    }
}
为了获得更好的方法,可以使用XPath

import javax.xml.xpath.*;

class Extract {
    public static void main(String[] args) {

        try {
            File fXmlFile = new File("data.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            XPath xpath = XPathFactory.newInstance().newXPath();
            NodeList nodes = (NodeList)xpath.evaluate("/TXNEXP/*/PAN", doc, XPathConstants.NODESET);
            for (int n = 0; n < nodes.getLength(); n++) {
                System.out.println(nodes.item(n).getFirstChild().getNodeValue());
                if (n == 1) {
                    nodes.item(n).getFirstChild().setNodeValue("4567");
                    System.out.println(nodes.item(n).getFirstChild().getNodeValue());
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }

    }
}

不确定它是否是相关的,但你的PAN标签缺少关闭斜杠到@ AsMasMasHER,认为它是关闭的。英雄联盟