gpt4 book ai didi

java - 如何遍历 NodeList 并仅更新 Java 中的子节点?

转载 作者:数据小太阳 更新时间:2023-10-29 02:56:23 26 4
gpt4 key购买 nike

在 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、时间、日期值的事务。我想遍历每个“事务”并分别更新其子节点(id、时间、日期),因此它们每个都会不同。如何做到这一点?

最佳答案

好吧,由于您将 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
}
}
}

关于java - 如何遍历 NodeList 并仅更新 Java 中的子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33455550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com