当循环删除XML中的节点时应该注意删除节点后长度变化的问题。
删除节点的方法:
list = root.getElementsByTagName("LineItemDetails");
length = list.getLength();
for (int i = 0; i < length; i++) {
Node node = list.item(0);
if(node.getParentNode().getNodeName() !=null && !node.getParentNode().getNodeName().equals("AirWaybillBillOfLadingInfo")){
root.removeChild(node);
}
}
方法二:
Element root = doc.getDocumentElement();
NodeList list = root.getElementsByTagName("LineItemDetails");
int length = list.getLength();
for(int i=0;i<list.getLength();i++){
Node nodeItem = list.item(i);
NodeList listChild = nodeItem.getChildNodes();
for(int k=0;k<listChild.getLength();k++){
Node nodeChild = listChild.item(k);
if(nodeChild.getNodeType()==Node.ELEMENT_NODE){
if(nodeChild.getNodeName().equals("MasterAirWaybillNo") || nodeChild.getNodeName().equals("HouseAirWaybillNo") || nodeChild.getNodeName().equals("ConsolidationIndicator") || nodeChild.getNodeName().equals("ConsolidationItemNo")){
nodeItem.removeChild(nodeChild);
k--;
}
}
}
}
方法三:
NodeList list = root.getElementsByTagName("LineItemDetails");
int length = list.getLength();
for(int i=0;i<list.getLength();i++){
Node nodeItem = list.item(i);
NodeList listChild = nodeItem.getChildNodes();
int leng = listChild.getLength();
for(int k=0;k<leng;k++){
Node nodeChild = listChild.item(k);
if(nodeChild.getNodeType()==Node.ELEMENT_NODE){
if(nodeChild.getNodeName().equals("MasterAirWaybillNo") || nodeChild.getNodeName().equals("HouseAirWaybillNo") || nodeChild.getNodeName().equals("ConsolidationIndicator") || nodeChild.getNodeName().equals("ConsolidationItemNo")){
nodeItem.removeChild(nodeChild);
k--;
leng--;
}
}
}
}
总之需要注意删除节点后,listChild.getLength();将重新获得值。。最好采用第三种方式。删除一个节点后将循环变量和总节点数都减少一。。