如何迭代NodeList并仅更新Java中的子节点?

时间:2015-10-31 19:14:31

标签: java xml dom

java中的xml解析有点新,所以我试图更新xml文档中的某些元素,但是我在更新正确的文件时遇到了一些问题。

<Transactions>
    <Transaction>
        <id>222</id>
        <time>...</time>
        <date>...</date>
    </Transaction>
    <Transaction>
        <id>333</id>
        <time>...</time>
        <date>...</date>
    </Transaction>
</Transactions>

鉴于上面的xml,我们说我想修改每个事务。我想用其他一些值更新id,时间和日期。我将使用不同的数据更新每笔交易。

所以我一直尝试下面的事情:

NodeList transactions = doc.getElementsByTagName("Transaction");
for(int i = 0; i < transactions.getLength(); i++){
NodeList id = doc.getElementsByTagName("id");
//some method to update
modifyId(id)//this works but it is doing it for all IDs in Document
}

上面的修改方法确实有效,它在我做了一些转换之后会更新,但它会更新所有具有相同id,时间,日期值的事务。我想遍历每个&#34; Transaction&#34;并分别更新其子节点(id,time,date),因此每个节点都不同。怎么办呢?

1 个答案:

答案 0 :(得分:5)

好吧,既然您将getElementsByTagName方法应用于doc - 整个文档 - 它会为您提供整个文档中名称为id的所有元素。

这个问题有几种解决方法。

一个是,当您遍历transaction节点列表时,使用getChildNodes()方法获取其子节点。然后,您可以在每个上使用getNodeName()。一旦你知道了元素的名称,就可以随心所欲地做任何事情。

for(int i = 0; i < transactions.getLength(); i++) {
    Node transaction = transactions.item(i);
    NodeList transactionChildren = transaction.getChildNodes();
    for ( int j = 0; j < transactionChildren.getLength(); j++ ) {
        Node elem = transactionChildren.item(j);
        switch ( elem.getNodeName() ) {
            case "id":
                // Whatever processing you want for id
                break;
            case "time":
                // Whatever processing you want for time
                break;
            case "date":
                // Whatever processing you want for date
                break;
        }
    }
}

另一种方法是,当您遍历transaction节点列表时,将每个节点强制转换为Element(强制转换应该成功,但您始终可以使用instanceof来阻止来自抱怨的编译器)。然后,您可以使用此特定元素的getElementsByTagName(...)方法。它应该只返回一个项目的节点列表。然后你可以用它做任何你想做的事。

for(int i = 0; i < transactions.getLength(); i++) {
    Node transactionNode = transactions.item(i);
    if ( transactionNode instanceof Element ) {
        transactionElem = (Element)transactionNode;
        NodeList elemList = transactionElem.getElementsByTagName("id");
        if ( elemList.getLength() >= 1 ) {
            Node idNode = elemList.item(0);
            // Do whatever you want with the id node
        }
        elemList = transactionElem.getElementsByTagName("date");
        if ( elemList.getLength() >= 1 ) {
            Node dateNode = elemList.item(0);
            // Do whatever you want with the date node
        }
        elemList = transactionElem.getElementsByTagName("time");
        if ( elemList.getLength() >= 1 ) {
            Node timeNode = elemList.item(0);
            // Do whatever you want with the time node
        }
    }
}