Как прочитать одно и то же значение тэга в последовательном порядке, используя Java - PullRequest
0 голосов
/ 08 января 2020
  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 Код:

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

 }} }}

В настоящее время мои фактические результаты отображаются, как показано ниже.

Номер счета: 123
Возраст : 29
Имя: Панкадж
Пол: Мужской
Роль: Java Разработчик
Возраст: 35
Имя: Jul ie
Пол: Женский
Роль: До tnet Разработчик

Номер счета: 456
Возраст: 29
Имя: Pankaj
Пол: Мужской
Роль: Java Разработчик
Возраст: 35
Имя: Jul ie
Пол: Женский
Роль: Do tnet Разработчик

Но мои ожидаемые результаты должны быть такими:

Номер счета: 123
Возраст: 29
Имя: Pankaj
Пол: Мужской
Роль: Java Разработчик

Номер счета: 456
Возраст: 35
Имя: Jul ie
Пол: Женский
Роль: Do tnet Разработчик

1 Ответ

1 голос
/ 08 января 2020

Примечание: XML в вопросе было изменено. Следующее основано на оригинальном XML с добавленным тегом root, как показано в конце ответа.


Вам необходимо использовать структуру XML, когда извлечение информации из дерева DOM.

По сути, не повторяйте элементы <Accountnumber>, повторяйте элементы <AccountDetails> документа, а затем используйте метод getElementsByTagName(...) для этих объектов Element, не метод для объекта Document, для поиска вложенных элементов.

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

Выход

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

Выше было проверено со следующим 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...