2017-02-12 12 views
0

イムは、XMLタグを使用してデータベースからデータを抽出しようとしているが、私はデータ抽出

'java.lang.String org.w3c.dom.Node.getNodeValue()' on a null object reference 

わからないこのエラーを取得維持、なぜその私は、ログのを持っている場合、タグがnullであると言って私はデータを抽出しようとする前に文字列を、それは私が信じるべきであるように見えます。

<?xml version="1.0" ?> 
    <database> 
    <account> 
    <id>1</id> 
    <fname>john</fname> 
    <lname>smith</lname> 
    <status>1</status> 
    </account> 
</database> 

これは、データを抽出しようとしている文字列の出力です。ここでは、それを抽出するために使用しているコードがあります。

 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();; 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document dom = db.parse (new ByteArrayInputStream(s.getBytes())); 
     Element docEle = dom.getDocumentElement(); 

     NodeList nl = docEle.getElementsByTagName("account"); 

     Element entry = (Element)nl.item(0); 
     Element id = (Element)entry.getElementsByTagName("id").item(0); 
     Element fname= (Element)entry.getElementsByTagName("fname").item(0); 
     Element lname = (Element)entry.getElementsByTagName("lname").item(0); 
     Element status= (Element)entry.getElementsByTagName("status").item(0); 

     user_id = id.getFirstChild().getNodeValue(); 
     user_fname = fname.getFirstChild().getNodeValue(); 
     user_lname = lname.getFirstChild().getNodeValue(); 
     user_status = status.getFirstChild().getNodeValue(); 

アプリがクラッシュすることが任意のヘルプは高く評価され、最初の要素からノード値を取得するのを試してみて、事前

+0

コード値である持っています微妙に間違っている可能性が高い。デフォルトの 'file.encoding'がUTF-8でない場合(WindowsではCp1252)、' s.getBytes() 'はWindows-1252データの配列を返しますが、XMLはエンコーディングを宣言しないので、デフォルトはUTF-8です。コードポイント127を超える文字は、文字化けするか、解析が失敗します。 'Charset'をとらない' getBytes() 'のオーバーロードを決して呼び出さないでください。 's.getBytes(StandardCharsets.UTF_8)'を使ってください。 –

+0

こんにちは、私はあなたが示唆したコードを追加しましたが、アプリケーションがまだクラッシュしている、それは違いがある場合は、Linuxベースに接続しているサーバー。 –

+1

どちらが「ヌル」になる?可能な複製の[NullPointerExceptionとは何ですか?どうすれば修正できますか?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

答えて

0

でのおかげであなたは<アカウント>タグを開始しているが、それを終わりませんでした。変更< /ユーザー>〜< /アカウント>

+0

私は間違いを訂正しましたが、違いはありません –

+1

@AndrewDeanあなたのコードはコンパイルさえしません。 'radius'と' loc'変数はありません。本当の助けが必要な場合は、実際のコードを投稿してください。 –

+0

@DavidConrad私は謝罪しました私は代入の一部としていくつかの変数名を変更しましたが、投稿でそれらを修正しました。 –

0

これはわかりやすいように管理されており、同様の問題を抱えている人には役立ちます。

Iは、以下をしたXML文字列からタグ名を読み取ることができるようにする(SはXML文字列変数である)

  InputSource is = new InputSource(); 
      is.setCharacterStream(new StringReader(s)); 

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();; 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document dom = db.parse(is); 
      Element docEle = dom.getDocumentElement(); 

      NodeList nl = docEle.getChildNodes(); 

      if (nl != null) { 
       int length = nl.getLength(); 
       for (int i = 0; i < length; i++) { 
        if (nl.item(i).getNodeType() == Node.ELEMENT_NODE) { 
         Element el = (Element) nl.item(i); 
         if (el.getNodeName().contains("account")) { 
          user_id = el.getElementsByTagName("id").item(0).getTextContent(); 
          user_fname = el.getElementsByTagName("fname").item(0).getTextContent(); 
          user_lname = el.getElementsByTagName("lname").item(0).getTextContent(); 
          user_status = el.getElementsByTagName("status").item(0).getTextContent(); 
         } 
        } 
       } 
      } 

USER_変数は、XMLタグが上記