对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,时间,日期),因此它们各自将不同.如何才能做到这一点?
好吧,既然你将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)
| 归档时间: |
|
| 查看次数: |
2995 次 |
| 最近记录: |