Java HTML / XML How to - Edit Node's Elements depending on node's attribute








Question

We would like to know how to edit Node's Elements depending on node's attribute.

Answer

import java.io.StringReader;
import java.io.StringWriter;
/*  w w  w.  j a  va  2 s .com*/
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;

public class Main {
    public static void main(String[] args) throws Exception {
        DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader("<root>\r\n" + //
                "<Users>\r\n" + //
                "   <App id=\"test\">\r\n" + //
                "      <Username>ADMIN</Username>\r\n" + //
                "      <Password>ADMIN</Password>\r\n" + //
                "   </App>\r\n" + //
                "</Users>\r\n" + //
                "<Users>\r\n" + //
                "   <App id=\"test2\">\r\n" + //
                "      <Username>ADMIN2</Username>\r\n" + //
                "      <Password>ADMIN2</Password>\r\n" + //
                "   </App>\r\n" + //
                "</Users>\r\n" + //
                "</root>")));
        String inputId = "test2";
        String xpathStr = "//Users/App[@id='" + inputId + "']";
        // retrieve elements and change their content
        XPath xpath = XPathFactory.newInstance().newXPath();
        XPathExpression expr = xpath.compile(xpathStr + "/Username");
        Node username = (Node) expr.evaluate(doc, XPathConstants.NODE);
        username.setTextContent("test-username");
        expr = xpath.compile(xpathStr + "/Password");
        Node password = (Node) expr.evaluate(doc, XPathConstants.NODE);
        password.setTextContent("test-password");
        // output the document
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(doc), new StreamResult(writer));
        System.out.println(writer.toString());

    }
}