добавить одноименный XML-узел в arrayList - PullRequest
0 голосов
/ 04 июня 2018

У меня проблема с добавлением файловых узлов xml к объекту

XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<Users>
    <User firstName="john">
        <lastName>fall</lastName>
        <score>12</score>
        <score>11</score>
        <score>9</score>
    </User>
    <User firstName="alen">
        <lastName>spring</lastName>
        <score>17</score>
        <score>15</score>
    </User>
</Users>

XML-файл имеет один и тот же score узел с другим значением

У пользовательского класса есть 3 поля fName, lName, List<Integer> scores и поданные оценки используются для добавления узла оценки в xml-файл.

Пользовательский класс:

import java.util.ArrayList;
import java.util.List;

public class User {

    private String fName;
    private String lName;
    private List<Integer> scores;

    public User() {
        this("firstName", "lastName", new ArrayList<>());

    }

    public User(String fName, String lName, List<Integer> scores) {

        setfName(fName);
        setlName(lName);
        setScores(scores);

    }

    public String getfName() {
        return fName;
    }

    public void setfName(String fName) {
        this.fName = fName;
    }

    public String getlName() {
        return lName;
    }

    public void setlName(String lName) {
        this.lName = lName;
    }

    public List<Integer> getScores() {
        return scores;
    }

    public void setScores(List<Integer> scores) {
        this.scores = scores;
    }

    public String toString() {

        StringBuilder sb = new StringBuilder();

        getScores().forEach(val -> sb.append(String.format("%12d\n%18s", val, "")));

        return String.format("%-12s%s%s\n\n", getfName(), getlName(), sb.toString());

    }

}

Теперь я пытаюсьчитать узлы XML-файла и добавлять в список пользовательских объектов:

метод readXml:

public static void readXml(String xmlFile) {

    Document doc = null;

    NodeList nList = null;
    NodeList nScoreList = null;
    Element el = null;

    String fName = null;
    String lName = null;
    List<Integer> scores;

    try {

        doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFile);
        doc.normalizeDocument();

        nList = doc.getElementsByTagName("User");

        scores = new ArrayList<>();

        for (int i = 0; i < nList.getLength(); i++) {

            el = (Element) nList.item(i);
            fName = el.getAttribute("firstName");
            lName = el.getElementsByTagName("lastName").item(0).getTextContent();

            nScoreList = el.getElementsByTagName("score");

            for (int j = 0; j < nScoreList.getLength(); j++)
                scores.add(Integer.valueOf(nScoreList.item(j).getTextContent()));

            System.out.println(new User(fName, lName, scores));

        }

    } catch (Exception e) {
        e.printStackTrace();
    }

}

вывод:

john         fall           12
                            11
                             9



alen        spring          12
                            11
                             9
                            17
                            15

, но мне нужен этот вывод:

john         fall           12
                            11
                             9


alen        spring          17
                            15

что я могу сделать для этой проблемы?

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Не делай всю эту работу.Просто сериализуйте с использованием XML-сериализатора.SimpleXml может сделать это:

public class Users {
    @XmlName("User")
    public List<User> users;
}
public class User {
    @XmlAttribute
    @XmlName("firstName")
    private String fName;
    @XmlName("lastName")
    private String lName;
    @XmlName("score")
    private List<Integer> scores;
}

final String data = ...
final SimpleXml simple = new SimpleXml();
final Users users = simple.fromXml(data, Users.class);
for (final User u : users.users) {
    System.out.println(u.fName + " " + u.lName + ": " + u.scores.toString());
}

Будет выводить:

john fall: [12, 11, 9]
alen spring: [17, 15]

Из центрального центра Maven:

<dependency>
    <groupId>com.github.codemonstur</groupId>
    <artifactId>simplexml</artifactId>
    <version>1.4.0</version>
</dependency>
0 голосов
/ 04 июня 2018

Вы повторно используете списки оценок для всех элементов в XML, поэтому каждый новый элемент будет переносить все оценки из предыдущего элемента.Создайте новый список для каждого элемента в xml, см. Ниже:

try {

    doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFile);
    doc.normalizeDocument();

    nList = doc.getElementsByTagName("User");

    // By placing the list here, all the scores get appended
    // throughout all the elements in the xml
    // scores = new ArrayList<>();

    for (int i = 0; i < nList.getLength(); i++) {

        el = (Element) nList.item(i);
        fName = el.getAttribute("firstName");
        lName = el.getElementsByTagName("lastName").item(0).getTextContent();

        nScoreList = el.getElementsByTagName("score");

        // Now scores is a fresh list every time you get a new element
        scores = new ArrayList<>();
        for (int j = 0; j < nScoreList.getLength(); j++)
            scores.add(Integer.valueOf(nScoreList.item(j).getTextContent()));

        System.out.println(new User(fName, lName, scores));

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...