2016-03-22 13 views
0

現在、特定のノードとその子をXMLファイル で削除する必要がありますが、ノードを削除しようとしているときは常にnullポインタ例外が発生します。 「位置」パラメータは、削除するノードの数になります。たとえば、位置3は予約ID(04113049)とその下のすべてを削除する必要があります。ここでJavaを使用してXMLファイルからノードを削除する問題

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> 
+0

'NodeList.item(インデックス)の' index'引数は 'ので、第三の要素を取得するために、あなたは' doc.getElementsByTagName(「予約」)を実行する必要があり、ゼロベースであることに注意してください。項目( 2) '。 –

答えて

1

まず、アイテムを()を使用してフィルタリングする(インデックス0から始まる)ゼロベースで、何のアイテム(3)あなたにはありませんファイル。

第2に、削除する前にその場所の予約を見つけることができることを常に確認する必要があります。あなたの場合、私はあなたがNullPointerを見ている理由であるnull要素に対して.getParentNode()を実行しようとしていると思います。

Element element = (Element)doc.getElementsByTagName("reservation").item(position); 
if (null != element) { 
    element.getParentNode().removeChild(element); 
    //etc 
    } 
関連する問題