【问题标题】:How to change the value of XML node using java?如何使用java更改XML节点的值?
【发布时间】:2018-03-12 21:55:32
【问题描述】:

我正在尝试重置节点的值,但由于某种原因,更改没有反映出来。我通过XPATH 获得标签,但它没有设置我给出的值。 reqXML 是 XML 文件

我的代码

public static String changeProductVersion(String reqXML) {

    try {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        Document document = null;
        DocumentBuilder builder = factory.newDocumentBuilder();
        InputSource source = new InputSource();
        source.setCharacterStream(new StringReader(reqXML));
        document = builder.parse(source);

        XPath xPath = XPathFactory.newInstance().newXPath();
        Element element = (Element) xPath.evaluate(NYPG3Constants.NY_PG3_RL, document, XPathConstants.NODE);

        if(element != null) {
            element.setTextContent("17.1.0");
            System.out.println(element.getTextContent());
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return reqXML;
}

提前致谢

【问题讨论】:

  • XML文件的结构是什么,NYPG3Constants.NY_PG3_RL常量的值是多少?您只是在代码中设置节点的值还是要将其保存在文件中?如果要保存,这段代码中没有说明。
  • 这是我的 XPATH,我想设置 17.1.0 而不是 14.0.0

标签: java xml parsing xpath


【解决方案1】:

我不得不做出一些假设和更改,因为我不知道您的 XML 文档是什么样的。但是,Element 类扩展了Node,而setTextContentNode 上的一个方法。您需要更新的是第一个子节点,它通常是元素的文本值,但您应该添加一些验证以确保。然后,一旦你更新了文本值,你需要将 DOM 序列化回它来自的任何形式:

public static String changeProductVersion(String reqXML, String xpathExpression) {

    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();
        Element element = (Element) xPath
                .compile(xpathExpression)
                .evaluate(document, XPathConstants.NODE);

        if(element != null) {
            NodeList childNodes = element.getChildNodes();

            // Get the first node which should be the text value.
            // Add some validation to make sure Node == Node.TEXT_NODE.
            Node node = (Node) childNodes.item(0);
            node.setTextContent("17.1.0");
        }

        System.out.println("Updated element value: " + element.getTextContent());

        // Serialise the updated DOM
        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();
    }

    System.out.println(updatedXML);
    return updatedXML;
}

【讨论】:

  • 是的,它符合我的要求,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多