如何从Java中的xml文件中删除元素

时间:2018-01-22 20:31:12

标签: java xml

 <?xml version="1.0" encoding="UTF-8" standalone="no"?><PetStore xmlns="http://www.training.mo.gov/PetStore">

      <Pet>
        <ID_Number>2</ID_Number>
        <Name>Max</Name>
        <Type>Dog</Type>
        <Age>13</Age>
      </Pet>
        <Pet>
        <ID_Number>5</ID_Number>
        <Name>Denzel</Name>
        <Type>Rat</Type>
        <Age>54</Age>
      </Pet>
      <Pet>
        <ID_Number>7</ID_Number>
        <Name>Pooch</Name>
        <Type>Snake</Type>
        <Age>5</Age>
      </Pet>
    </PetStore>

这是我的xml代码

public void removePet(int petId) throws IllegalArgumentException {
    NodeList pets = xmlDoc.getElementsByTagName("Pet"); // List of the Pet node's child nodes

    int numPets = pets.getLength();
    for (int i = 0; i < numPets; i++) {
        Node nNode = pets.item(i);
        Element petElement = (Element) nNode;
        if (petId == Integer.parseInt(petElement.getElementsByTagName("ID_Number").item(0).getTextContent())){
            nNode.getParentNode().removeChild(nNode);
            //break;    
        }
    }

    try {
        transform(xmlDoc);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

然后我的java函数用于删除Pet元素,但是在我的if语句中抛出了空指针异常,并且未删除该节点。不确定从这一点正确删除元素需要做什么。中断暂时解决了这个问题,但是在另一个函数中删除所有Pet元素,这个中断允许删除一个元素。我知道这是因为休息。现在试图找出如何完成两个删除没有休息

1 个答案:

答案 0 :(得分:0)

删除NodeList中的节点将导致NodeList更新。此时,您尝试访问的最后一个节点在您期望的索引处不存在。尝试保留一组要更新的目标,然后将其删除:

    Set<Element> targetElements = new HashSet<Element>();

    int numPets = pets.getLength();
    for (int i = 0; i < numPets; i++) {
        Node nNode = pets.item(i);
        Element petElement = (Element) nNode;
        if (5 == Integer.parseInt(petElement.getElementsByTagName("ID_Number").item(0).getTextContent())){
            targetElements.add(petElement);
        }
    }

    for (Element e: targetElements) {
      e.getParentNode().removeChild(e);
    }

您还需要在删除所有宠物元素的方法中应用此技术。

请参阅:Removing DOM nodes when traversing a NodeList