【问题标题】:How Can I Iterate Through A Node List And Replace The Content If Certain Conditions Are Met?满足一定条件,如何遍历节点列表并替换内容?
【发布时间】:2019-04-20 11:18:58
【问题描述】:

我尝试遍历您可以在下面看到的 .xml 文件并检查每个用户(这里:user1 和 user2),当前标签的值是否与总标签的值相同,如果不是,给当前标签的值加上一个特定的值(例如+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 &lt; 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>

【问题讨论】:

    标签: java xml dom


    【解决方案1】:

    问题在于当前和总计的比较是在填充两个变量的循环内进行的。所以比较是在只填充一个变量后完成的。您需要将 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));
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      相关资源
      最近更新 更多