2011-06-30 26 views
0

私はかなりの時間この問題に取り組んできましたが、それを理解することはできません。解析され、画面上に表示する必要が与えられた「XML」ファイルがあります:Javaでfake-xmlファイルを解析する

<office> 

<name>joe</name> 
<surname>smith</surname> 
<name>bob</name> 
<surname>black</surname> 

..... 
</office> 

は、私はライン上のコードのいくつかの素晴らしいサンプルを見つけたが、彼らはのXMLファイルで作業していないようですこのように正しく設定されていないので、タグを追加するとコードが動作するようになりますが、問題は "xml"ファイルに変更を加えることができないことです。

これは私がここで見つけた他の誰かのコードであり、変更されています。ここで

は改造と私のコードです:

java.lang.NullPointerException 
    at Data.main(Data.java:45) //maybe a different line in the code for you. 

私はカウンターのための文書のルートを使用している場合は、それがために、一度結果を出力します。私が手

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Scanner; 

import org.w3c.dom.*; 

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.ParserConfigurationException; 

import org.xml.sax.SAXException; 
import org.xml.sax.SAXParseException; 

public class ReadAndPrintXMLFile{ 

public static void main (String argv []) throws ParserConfigurationException, SAXException, IOException{ 



try { 

     DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse (new File("office.xml")); 

     // normalize text representation 
     doc.getDocumentElement().normalize(); 
     System.out.println ("Root element of the doc is " + 
     doc.getDocumentElement().getNodeName() + "\n"); 

     //counts how many times <name> is found in the file 
     //then the number is used in the for loop below    
     NodeList listOfTerms = doc.getElementsByTagName("name"); 

     int totalTerms = listOfTerms.getLength(); 
     System.out.println("Total no of terms : " + totalTerms + "\n"); 



     for(int s= 0; s<listOfTerms.getLength() ; s++){ 


      Node firstTermNode = listOfTerms.item(s); 
      if(firstTermNode.getNodeType() == Node.ELEMENT_NODE){ 


       Element firstTermElement = (Element)firstTermNode; 

       //------- 
       NodeList firstWordList = firstTermElement.getElementsByTagName("name"); 
       Element firstWordElement = (Element)firstWordList.item(0); 

       NodeList textWordList = firstWordElement.getChildNodes(); 
       System.out.println("Name : " + 
         ((Node)textWordList.item(0)).getNodeValue().trim()); 

       //------- 
       NodeList defList = firstTermElement.getElementsByTagName("surname"); 
       Element defElement = (Element)defList.item(0); 

       NodeList textDefList = defElement.getChildNodes(); 
       System.out.println("Surname : " + 
         ((Node)textDefList.item(0)).getNodeValue().trim()); 



      }//end of if clause 


     }//end of for loop with s var 


    }catch (SAXParseException err) { 
    System.out.println ("** Parsing error" + ", line " 
     + err.getLineNumber() + ", uri " + err.getSystemId()); 
    System.out.println(" " + err.getMessage()); 

    }catch (SAXException e) { 
    Exception x = e.getException(); 
    ((x == null) ? e : x).printStackTrace(); 

    }catch (Throwable t) { 
    t.printStackTrace(); 
    } 
    //System.exit (0); 


}//end of main 
} 

エラーメッセージはこれですgetChildNodes()が正しく動作しない何らかの理由があります。

+1

コードをデバッグしようとしましたか?少なくとも#45の行があると言う。 – AlexR

+0

@Bart、はい、私はそれをデバッグしようとしました。それは以下の行です:NodeList textWordList = firstWordElement.getChildNodes();エラーが参照していることを示します。 – arubin

答えて

2

.getElementsByTagName( "name")を2回実行することに気づきました。あなたは<名前> < >内のタグを期待していますか?そうでない場合は、エラーの原因として考えられます.2回目以降、空のリストが返され、firstWordElementを参照しようとするとNullPointerExceptionが発生します。

「姓あなたがforループでやっていることである「名前」リスト。その「名前」の要素を取得するために、別々のステップでそれらを取得します。その後、

NodeList listOfTerms = doc.getElementsByTagName("name"); 
    int totalTerms = listOfTerms.getLength(); 
    System.out.println("Total no of terms : " + totalTerms + "\n"); 
    for(int s= 0; s<listOfTerms.getLength() ; s++){ 
     Node firstTermNode = listOfTerms.item(s); 
     if(firstTermNode.getNodeType() == Node.ELEMENT_NODE){ 
      Element firstTermElement = (Element)firstTermNode; 
      System.out.println(firstTermElement.getTextContent()); 
     }//end of if clause 
    }//end of for loop with s var 

との姓を取得するために、ちょうどタグ名役立ちます

listOfTerms = doc.getElementsByTagName("surname"); 
totalTerms = listOfTerms.getLength(); 
System.out.println("Total no of terms : " + totalTerms + "\n"); 
for(int s= 0; s<listOfTerms.getLength() ; s++){ 
    Node firstTermNode = listOfTerms.item(s); 
    if(firstTermNode.getNodeType() == Node.ELEMENT_NODE){ 
     Element firstTermElement = (Element)firstTermNode; 
     System.out.println(firstTermElement.getTextContent()); 
    }//end of if clause 
}//end of for loop with s var 

希望を変えます。

+0

あなたの助言に感謝します。私はあなたがそれを記述した方法でコードを変更しようとします。ちなみに、この質問を書いた直後、私はこのようなXMLファイルを解析する別の方法を見つけました – arubin

関連する問題