Как я могу перебрать список узлов и заменить содержимое, если выполняются определенные условия? - PullRequest
1 голос
/ 20 апреля 2019

Я пытаюсь перебрать файл .xml, который вы видите ниже, и проверить для каждого пользователя (здесь: user1 и user2), совпадает ли значение current-tag со значением total-tag, и еслинет, добавьте определенное значение (например, +10) к значению текущего тега.

<config>
    <users>
        <user1>
            <name>test1</name>
            <stats>
                <total>50</total>
                <current>50</current>
            </stats>
        </user1>
        <user2>
            <name>test2</name>
            <stats>
                <total>50</total>
                <current>20</current>
            </stats>
        </user2>
    </users>
</config>

Я использую следующий код для перебора дочерних узлов тега stats и сравнениядля каждого пользователя значение тега current со значением тега total:

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder;
        docBuilder = docFactory.newDocumentBuilder();

        Document doc = docBuilder.parse(names_saves);
        doc.getDocumentElement().normalize();

        NodeList stats = doc.getElementsByTagName("stats");

        for(int i = 0; i < stats.getLength(); i++) {
            org.w3c.dom.Node n = stats.item(i);
            NodeList children= n.getChildNodes();
            for ( int x = 0; x < children.getLength(); x++ ) {
                Node elem = children.item(x);

                int current = 0;
                int total = 0;

                switch ( elem.getNodeName() ) {
                    case "current":
                        current = Integer.parseInt(elem.getTextContent());
                        break;
                    case "total":
                        total = Integer.parseInt(elem.getTextContent());
                        break;
                }

                if(current < total) {
                    Element element = (Element) elem;
                    element.getElementsByTagName("current").item(0).setTextContent(Integer.toString(current + 10));
                }
            }
        }

Проблема этого кода в том, что он генерирует исключение NullPointerException в element.getElementsByTagName(....Я уже распечатал значения переменных current и total, и они показывали правильные значения, но, как я сравнил его в if(current < total), оно всегда было истинным, а не ложным для user1 и для user2 true.

В итоге все должно выглядеть так:

<config>
    <users>
        <user1>
            <name>test1</name>
            <stats>
                <total>50</total>
                <current>50</current> <!-- Is already the same the value of total, don't edit -->
            </stats>
        </user1>
        <user2>
            <name>test2</name>
            <stats>
                <total>50</total>
                <current>30</current> <!-- Not the same, add 10 to former value -->
            </stats>
        </user2>
    </users>
</config>

1 Ответ

1 голос
/ 20 апреля 2019

Проблема в том, что сравнение текущего и общего происходит внутри цикла, где вы заполняете две переменные.Таким образом, сравнение выполняется после заполнения только одной переменной.вам нужно переместить if за пределы цикла и лучше убедиться, что на самом деле обе переменные были установлены на что-то большее нуля (при условии, что это значение не может быть введено)

        int current = 0;
        int total = 0;
        for ( int x = 0; x < children.getLength(); x++ ) {
            Node elem = children.item(x);

            switch ( elem.getNodeName() ) {
                case "current":
                    current = Integer.parseInt(elem.getTextContent());
                    break;
                case "total":
                    total = Integer.parseInt(elem.getTextContent());
                    break;
            }

        }
        if(current > 0 && total > 0 && current < total) {
            Element element = (Element) elem;
            element.getElementsByTagName("current").item(0).setTextContent(Integer.toString(current + 10));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...