Search code examples
javaxmldomxml-parsingsax

How I can insert node at beginning xml file?


I need insert node to the beginning of my XML file, after I sought in web I found keyword insertBefore but I can't apply this keyword in my code. However when I used appendChild, then inserted this keyword the element gets inserted to the end of xml file.How can I use insertBefore keyword to insert to beginning of xml tree.
For example:

   <n>
        <a2>
         <b></b> <c></c>
        </a2>

        <a1>
         <b></b> <c></c>
        </a1>
    </n>

I need to insert element to the beginning of the xml file same that:

<n>
    <a1>
     <b></b> <c></c>
    </a1> 

    <a2>
     <b></b> <c></c>
    </a2>
</n>

my java code:

public void insertNewProject(Project entity) {
        String filePath = "location.xml";
        File xmlFile = new File(filePath);
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;
        try {
            dBuilder = dbFactory.newDocumentBuilder();
            Document doc;

            doc = dBuilder.parse(xmlFile);

            doc.getDocumentElement().normalize();

            Node n = doc.getElementsByTagName("n").item(0);

            Element a = doc.createElement("a");
            n.appendChild(a);

            Element b = doc.createElement("b");
            b.appendChild(doc.createTextNode(entity.getLocation()));
            a.appendChild(b);

            Element c = doc.createElement("c");
            c.appendChild(doc.createTextNode(entity.getName()));
            a.appendChild(c);

            doc.getDocumentElement().normalize();

            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource domSource = new DOMSource(doc);
            StreamResult streamResult = new StreamResult(new File("location.xml"));
            transformer.transform(domSource, streamResult);

        } catch (ParserConfigurationException pce) {
            return;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException tfe) {
            return;
        }

    }

Solution

  • Why cant you use the firstChild method and then insert before? Like

    n.insertBefore(a, n.getFirstChild());
    

    Full code

    public void insertNewProject(Project entity) {
        String filePath = "location.xml";
        File xmlFile = new File(filePath);
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;
        try {
            dBuilder = dbFactory.newDocumentBuilder();
            Document doc;
    
            doc = dBuilder.parse(xmlFile);
    
            doc.getDocumentElement().normalize();
    
            Node n = doc.getElementsByTagName("n").item(0);
    
            Element a = doc.createElement("a");
            n.insertBefore(a, n.getFirstChild());
    
            Element b = doc.createElement("b");
            b.appendChild(doc.createTextNode(entity.getLocation()));
            a.appendChild(b);
    
            Element c = doc.createElement("c");
            c.appendChild(doc.createTextNode(entity.getName()));
            a.appendChild(c);
    
            doc.getDocumentElement().normalize();
    
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource domSource = new DOMSource(doc);
            StreamResult streamResult = new StreamResult(new File("location.xml"));
            transformer.transform(domSource, streamResult);
    
        } catch (ParserConfigurationException pce) {
            return;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (TransformerException tfe) {
            return;
        }
    }