我有这种方法可以从XML文件中删除节点:
public static void deleteElement(Document doc, String elementType, String tagName, String valueToCheck) {
// <elementType>
NodeList nodes = doc.getElementsByTagName(elementType);
System.out.println("NODES: "+nodes.getLength());
for (int i = 0; i < nodes.getLength(); i++) {
Element person = (Element) nodes.item(i);
// <tagName>
Element name = (Element) person.getElementsByTagName(tagName).item(0);
String pName = name.getTextContent();
System.out.println(pName);
if (pName.equals(valueToCheck)) {
person.getParentNode().removeChild(person);
System.out.println("match" + pName);
}
}
System.out.println("NODES AFTER DELETE: "+nodes.getLength());
}
我在其中指定根元素,要检查的标签和要检查的值。
在我的XML上:
<?xml version="1.0"?>
<book>
<person>
<id>1</id>
<name>Person 1</name>
</person>
<person>
<id>1</id>
<name>Person 2</name>
</person>
<person>
<id>3</id>
<name>Person 3</name>
</person>
<person>
<id>4</id>
<name>Person 3</name>
</person>
</book>
与参数执行该方法之后的输出person
,name
,Person 3
是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<book>
<person>
<id>1</id>
<name>Person 1</name>
</person>
<person>
<id>1</id>
<name>Person 2</name>
</person>
<person>
<id>4</id>
<name>Person 3</name>
</person>
</book>
也就是说,仅删除了第一个外观...为什么有任何想法?
DOM节点列表是活动的,换句话说,当您修改文档时,节点列表会更改以反映文档的新状态。在循环的第三次迭代中,您item(2)
从文档中删除了第一个匹配元素()。这也会导致它从nodes
列表中消失,将列表缩短一个节点,并在上一个索引之后移动所有内容-第二个匹配节点变为item(2)
。然后增加i
并找到它== nodes.getLength()
,循环结束而不处理最后一个条目。
为了避免这种情况,请向后迭代:
for (int i = nodes.getLength() - 1; i >= 0; i--)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句