使用java从XML文件中删除节点时出现问题

使用java从XML文件中删除节点时出现问题,java,xml,removechild,Java,Xml,Removechild,目前,我需要删除XML文件中的特定节点及其子节点 但是,每当我试图删除节点时,总是遇到空指针异常。“position”参数将是要删除的节点的#。e、 g位置3应删除预订id(04113049)及其下的所有内容 public void removeReservation(int position){ try{ File file = new File("reservations.xml"); DocumentBuilderFactory factory

目前,我需要删除XML文件中的特定节点及其子节点 但是,每当我试图删除节点时,总是遇到空指针异常。“position”参数将是要删除的节点的#。e、 g位置3应删除预订id(04113049)及其下的所有内容

public void removeReservation(int position){

    try{

        File file = new File("reservations.xml");
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(file);
        Element element = (Element)doc.getElementsByTagName("reservation").item(position);
        element.getParentNode().removeChild(element);

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);

        StreamResult result = new StreamResult(new File("reservations.xml"));
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.transform(source, result);


    }
    catch(Exception e){
        e.printStackTrace();
    }
}
以下是xml文件的内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data>
<reservation_list>

<reservation>
<resID>01014664</resID>
<roomNo>0101</roomNo>
<roomType>VIPSuite</roomType>
<noOfGuest>3</noOfGuest>
<bedType>Master</bedType>
<smoking>Y</smoking> 
<startDate>121313</startDate>
<endDate>121316</endDate>
<wifi>Y</wifi>
<roomView>Y</roomView>
<availability>Reserved</availability>
<name>Johnny depp</name>
<address>NTU Hall 17 #01-111</address>
<country>Singapore</country>
<gender>Male</gender>
<nationality>Singaporean</nationality>
<contact>92003239</contact>
<creditCardNo>1234567812345678</creditCardNo>
<creditCardCSV>432</creditCardCSV>
<creditCardExpDate>11/16</creditCardExpDate>
<identity>U0000000I</identity>
</reservation>

<reservation>
<resID>11025652</resID>
<roomNo>1102</roomNo>
<roomType>Double</roomType>
<noOfGuest>3</noOfGuest>
<bedType>Master</bedType>
<smoking>Y</smoking>
<startDate>1212</startDate>
<endDate>1213</endDate>
<wifi>Y</wifi>
<roomView>Y</roomView>
<availability>Reserved</availability>
<name>Thomas</name>
<address>Mountbatten #2-12 Garden ave</address>
<country>Singapore</country>
<gender>Male</gender>
<nationality>Singaporean</nationality>
<contact>93482032</contact>
<creditCardNo>1234567812345678</creditCardNo>
<creditCardCSV>588</creditCardCSV>
<creditCardExpDate>3/16</creditCardExpDate>
<identity>U1234567I</identity>
</reservation>

<reservation>
<resID>04113049</resID>
<roomNo>0411</roomNo>
<roomType>VIPSuite</roomType>
<noOfGuest>7</noOfGuest>
<bedType>Master</bedType>
<smoking>Y</smoking>
<startDate>121112</startDate>
<endDate>232333</endDate>
<wifi>Y</wifi>
<roomView>Y</roomView>
<availability>Reserved</availability>
<name>elaine</name>
<address>punggol</address>
<country>Singapore</country>
<gender>Female</gender>
<nationality>Singaporean</nationality>
<contact>12345672</contact>
<creditCardNo>1234123412341234</creditCardNo>
<creditCardCSV>123</creditCardCSV>
<creditCardExpDate>1212</creditCardExpDate>
<identity>S96777777777F</identity>
</reservation>
</reservation_list>
</data>

01014664
0101
硅灰石
3.
主人
Y
121313
121316
Y
Y
含蓄的
约翰尼·德普
台大礼堂17#01-111
新加坡
男性
新加坡人
92003239
1234567812345678
432
11/16
U0000000I
11025652
1102
双重的
3.
主人
Y
1212
1213
Y
Y
含蓄的
托马斯
蒙巴顿花园大道2-12号
新加坡
男性
新加坡人
93482032
1234567812345678
588
3/16
U1234567I
04113049
0411
硅灰石
7.
主人
Y
121112
232333
Y
Y
含蓄的
伊莱恩
蓬格尔
新加坡
女性
新加坡人
12345672
1234123412341234
123
1212
S96777F

首先,使用item()进行过滤是基于零的(从索引0开始),文件中没有项(3)

第二,在你试图删除之前,你应该始终检查你是否能够找到该职位的预订。在您的例子中,我认为您正在尝试对null元素执行.getParentNode(),这就是为什么您会看到null指针

Element element = (Element)doc.getElementsByTagName("reservation").item(position);
if ( null != element) {
   element.getParentNode().removeChild(element);
  //etc 
    }

首先,使用item()进行过滤是基于零的(从索引0开始),文件中没有项(3)

第二,在你试图删除之前,你应该始终检查你是否能够找到该职位的预订。在您的例子中,我认为您正在尝试对null元素执行.getParentNode(),这就是为什么您会看到null指针

Element element = (Element)doc.getElementsByTagName("reservation").item(position);
if ( null != element) {
   element.getParentNode().removeChild(element);
  //etc 
    }

请注意,
NodeList.item(index)
index
参数是基于零的,因此要获取第三个元素,需要执行
doc.getElementsByTagName(“reservation”).item(2)
。请注意,
NodeList.item(index)
index
参数是基于零的,因此要获取第三个元素,您需要执行
doc.getElementsByTagName(“预订”).item(2)