简体   繁体   中英

How to read the same tagname value in sequential order using Java

  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

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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM