MohammadTofi
MohammadTofi

Reputation: 385

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

    }

Upvotes: 1

Views: 2304

Answers (3)

Syam S
Syam S

Reputation: 8499

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

Upvotes: 2

Aamir Latif
Aamir Latif

Reputation: 56

to insert an element in start you need to know what is first element. then you can insert node in start by following changes in your code

doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();        
NodeList nlist = doc.getElementsByTagName("a2");            

Node n = doc.getElementsByTagName("n").item(0);
Node a1 = nlist.item(0);
Element a = doc.createElement("a");
n.insertBefore(a, a1);

Upvotes: 0

Hirak
Hirak

Reputation: 3649

I changed the following part in your code. Please check if this is what you are looking for?

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

        Node a2 = doc.getElementsByTagName("a2").item(0);
        n.insertBefore(a, a2);//.appendChild(a);

Upvotes: 0

Related Questions