如何修改多个XML标签的值?

时间:2018-08-28 15:55:56

标签: java xml xpath

我一直试图在Java中修改多个XML标记的值。到目前为止,我已经能够获取要修改的两个节点的值,但是在设置值时,它始终会覆盖第一个节点和第二个节点。

XML

 <driver>
    <BirthDate>1977-07-18</BirthDate>
    <Age>40</Age>                    
    <Gender>M</Gender>
    <PrimaryResidence>OwnCondo</PrimaryResidence>
 </driver> 

我正在尝试更改Gender和PrimaryResidence标签。

代码

// Modifies multiple XML nodes
 public static String changeCoreDiscountType(String reqXML) {
        Document document = null;
        String updatedXML = null;
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(reqXML));
            document = builder.parse(is);

            XPath xPath = XPathFactory.newInstance().newXPath();
            XPathExpression expression = xPath.compile("/driver/Gender | /driver/PrimaryResidence");
            NodeList nodeList = (NodeList) expression.evaluate(document,XPathConstants.NODESET);

            for(int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                node.setTextContent("F");
                node.setTextContent("OwnCondo");
                String value = node.getTextContent();
            }

            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(new StringWriter());
            transformer.transform(source, result);

            updatedXML = result.getWriter().toString();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return updatedXML;
    }

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您需要先检查是否要更新正确的节点,例如

for(int i = 0; i < nodeList.getLength(); i++) {
    Node node = nodeList.item(i);

    if(node.getNodeName() == "Gender")
        node.setTextContent("F");
    if(node.getNodeName() == "PrimaryResidence")
        node.setTextContent("OwnCondo");
}

Full Demo