如果遇到某些条件,我如何通过节点列表进行迭代并替换内容?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果遇到某些条件,我如何通过节点列表进行迭代并替换内容?相关的知识,希望对你有一定的参考价值。

我尝试迭代你可以看到下面的.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-tag的子节点,并为每个用户比较current-tag的值和total-tag的值:

        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。我已经打印出变量currenttotal的值,它们显示正确的值,但是当我在if(current < total)进行比较时,它总是正确的,而对于user1和user2都不是false。

最后,它应该是这样的:

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

以上是关于如果遇到某些条件,我如何通过节点列表进行迭代并替换内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过对象的具有特定变量列表循环?

删除与Python列表中的条件匹配的前N个项

如何增加列表并将某些值替换为其计数

在迭代期间将对象添加到现有列表

根据另一个列表中的条件删除一个列表中的某些元素

使用条件和选择迭代python中的列表