0
  Sample tag in XML file:

  <AccountDetailsList>   
         <AccountDetails>
             <Accountnumber>123/<Accountnumber> 
         </AccountDetails>  
         <PersonalDetailsList>
               <age>29</age>
               <name>Pankaj</name>
               <gender>Male</gender>
               <role>Java Developer</role>  
         </PersonalDetailsList>    

         <AccountDetails>
              <Accountnumber>456/<Accountnumber>  
         </AccountDetails> 
         <PersonalDetailsList>            
               <age>35</age>
               <name>Julie</name>
               <gender>Female</gender>
               <role>Dotnet Developer</role>   
         </PersonalDetailsList>       
  </AccountDetailsList>

Java Code:

 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 
 Document document =documentBuilder.parse(file);               

 NodeList nodeList1 = document.getElementsByTagName("Accountnumber");               
 for (int k = 0; k < nodeList1.getLength(); k++) {
               Node accountnode = nodeList1.item(k); //to read all the tags from account number
                if (accountnode != null) { 

   String acc = document.getElementsByTagName("Accountnumber").item(k).getTextContent();

   System.out.println("Account number:" + " " + acc);

 NodeList nodeList2 = document.getElementsByTagName("age");

           for (int j = 1; j < nodeList2.getLength(); j++) {           
           Node age_node = nodeList2.item(j);
              if (age_node != null) { 

 String age = document.getElementsByTagName("age").item(j).getTextContent()   
 String name = document.getElementsByTagName("name").item(j).getTextContent() 
 String gender = document.getElementsByTagName("gender").item(j).getTextContent().  
 String role = document.getElementsByTagName("role").item(j).getTextContent()

 System.out.println("Age:" + age); 
 System.out.println("Name:" + name); 
 System.out.println("Gender:" + name); 
 System.out.println("Role:" + name); 

 }} }}

Currently my actual results are displaying like below list.

Account Number: 123
Age:29
Name: Pankaj
Gender: Male
Role: Java Developer
Age:35
Name: Julie
Gender: Female
Role: Dotnet Developer

Account Number: 456
Age:29
Name: Pankaj
Gender: Male
Role: Java Developer
Age:35
Name: Julie
Gender: Female
Role: Dotnet Developer

But my expected results should be like this:

Account Number: 123
Age:29
Name: Pankaj
Gender: Male
Role: Java Developer

Account Number: 456
Age:35
Name: Julie
Gender: Female
Role: Dotnet Developer

3
  • Not sure what you are expecting here. Is that the expected result which is posted above? Commented Jan 8, 2020 at 8:13
  • First of all, your XML is not well formed. You must contain a root element under which you can have multiple nodes of same name. You cannot have two <AccountDetailsList>'s unless it is wrapped under one root element. Commented Jan 8, 2020 at 8:16
  • @NaveenBharadwaj I have updated XML, expected result and actual results. Can you please check now. Commented Jan 8, 2020 at 8:24

1 Answer 1

1

Note: The XML in the question has been changed. The following is based on the original XML, with a root tag added, as shown at the end of the answer.


You need to use the XML structure when extracting the information from the DOM tree.

Basically, don't iterate the <Accountnumber> elements, iterate the <AccountDetails> elements of the document, then use the getElementsByTagName(...) method on those Element objects, not the method on the Document object, to scan for nested elements.

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(file);

NodeList accountDetailsNodes = document.getElementsByTagName("AccountDetails");
for (int i = 0; i < accountDetailsNodes.getLength(); i++) {
    Element accountDetailsElem = (Element) accountDetailsNodes.item(i);
    String accountnumber = accountDetailsElem.getElementsByTagName("Accountnumber").item(0).getTextContent();
    System.out.println("Account #" + (i + 1) + ":");
    System.out.println("  Account number: " + accountnumber);

    NodeList personalDetailsNodes = accountDetailsElem.getElementsByTagName("PersonalDetails");
    for (int j = 0; j < personalDetailsNodes.getLength(); j++) {
        Element personalDetailsElem = (Element) personalDetailsNodes.item(j);
        String age    = personalDetailsElem.getElementsByTagName("age").item(0).getTextContent();
        String name   = personalDetailsElem.getElementsByTagName("name").item(0).getTextContent();
        String gender = personalDetailsElem.getElementsByTagName("gender").item(0).getTextContent();
        String role   = personalDetailsElem.getElementsByTagName("role").item(0).getTextContent();
        System.out.println("  Person #" + (j + 1) + ":");
        System.out.println("    Age: " + age);
        System.out.println("    Name: " + name);
        System.out.println("    Gender: " + gender);
        System.out.println("    Role: " + role);
    }
}

Output

Account #1:
  Account number: 123
  Person #1:
    Age: 29
    Name: Pankaj
    Gender: Male
    Role: Java Developer
Account #2:
  Account number: 456
  Person #1:
    Age: 35
    Name: Julie
    Gender: Female
    Role: Dotnet Developer

The above was tested with the following XML:

<Root>
    <AccountDetailsList>
        <AccountDetails>
            <Accountnumber>123</Accountnumber>
            <PersonalDetailsList>
                <PersonalDetails>
                    <age>29</age>
                    <name>Pankaj</name>
                    <gender>Male</gender>
                    <role>Java Developer</role>
                </PersonalDetails>
            </PersonalDetailsList>
        </AccountDetails>
    </AccountDetailsList>

    <AccountDetailsList>
        <AccountDetails>
            <Accountnumber>456</Accountnumber>
            <PersonalDetailsList>
                <PersonalDetails>
                    <age>35</age>
                    <name>Julie</name>
                    <gender>Female</gender>
                    <role>Dotnet Developer</role>
                </PersonalDetails>
            </PersonalDetailsList>
        </AccountDetails>
    </AccountDetailsList>
</Root>
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.