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),因此每个节点都不同。怎么办呢?
答案 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
}
}
}