java - 如何在满足一定条件的情况下迭代节点列表并替换内容?

标签 java xml dom

我尝试迭代 .xml 文件(您可以在下面看到)并检查每个用户(此处:user1 和 user2),当前标签的值是否与总标签的值相同,并且如果不,请在 current-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 的子节点-tag 并为每个用户比较 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));
                }
            }
        }

此代码的问题是,它在 element.getElementsByTagName(... 处抛出 NullPointerException 。我已经打印出了变量 current 的值和total他们显示了正确的值,但当我在 if(current < total) 进行比较时,它始终为 true,并且对于 user1 和 user2 来说不是 false 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>

最佳答案

问题在于当前和总计的比较是在填充两个变量的循环内部进行的。因此,仅填充一个变量后即可进行比较。您需要将 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));
        }

关于java - 如何在满足一定条件的情况下迭代节点列表并替换内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55772996/

相关文章:

java - 使用 jaxb 格式化对象列表的 XML

JavaFX 2 网页 View : How to enhance the scrollbars

c# - 将 XML 文件反序列化为 C# 类

java - 使用不同的外键 id 复制同一类的对象

java - 如何获取调用堆栈元素 *没有* arg 签名的方法实例?

xml - 如何在 XML Schema 1.1 中使用替代方案

javascript - 如何在 php 语言(或 javascript)上将 InDesign 文件与 XML 标签文件粘合?

Javascript 进程卡住 HTML 输入元素

javascript - 有人想帮我解决这个 javascript 逻辑吗?

javascript - window.getSelection().getRangeAt(0) insideHTML 不破坏节点