首页 > 解决方案 > 如何修改多个 XML 标签的值?

问题描述

我一直在尝试修改 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;
    }

任何帮助表示赞赏。

标签: javaxmlxpath

解决方案


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

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");
}

完整演示


推荐阅读