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

ton*_*ony 2 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>
Run Code Online (Sandbox Code Playgroud)

给出上面的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
}
Run Code Online (Sandbox Code Playgroud)

上面的修改方法确实有效,并且在我做了一些转换之后它会更新,但是它正在更新具有相同id,时间,日期值的所有事务.我想遍历每个"事务"并分别更新其子节点(id,时间,日期),因此它们各自将不同.如何才能做到这一点?

Rea*_*tic 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是,当您遍历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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)