8

一部のサブタグ (子ノード要素) がオプションである XML ファイルがあります。例えば

<part>
   <note>
       </rest>
   </note>

   <note>
       <pitch></pitch>
   </note>

   <note>
       <pitch></pitch>
   </note>
</part>

しかし、XML ファイルをタグで読み取ると、NullPointerException がスローされます。これは、一部のサブタグがオプションであるためです (例: 上記の例の rest と pitch)。どうすればこれを除外できますか? 特定のタグ名で要素が存在するかどうかを確認する方法は見つかりませんでした。getElementsByTagName("tag-name") メソッドが NULL を返さないかどうかを確認する条件があっても、条件本体に入り、明らかに例外をスローします。どうすればこれを解決できますか?

Java コードは次のとおりです。

if(fstelm_Note.getElementsByTagName("rest")!=null){
    if(fstelm_Note.getElementsByTagName("rest")==null){
        break;
    }
    NodeList restElmLst = fstelm_Note.getElementsByTagName("rest");
    Element restElm = (Element)restElmLst.item(0);
    NodeList rest = restElm.getChildNodes();

    String restVal = ((Node)rest.item(0)).getNodeValue().toString();

}else if(fstelm_Note.getElementsByTagName("note")!=null){
    if(fstelm_Note.getElementsByTagName("note")==null){
        break;
    }

    NodeList noteElmLst = fstelm_Note.getElementsByTagName("note");
    Element noteElm = (Element)noteElmLst.item(0);

    NodeList note = noteElm.getChildNodes();
    String noteVal = ((Node)note.item(0)).getNodeValue().toString();
}

洞察や提案をいただければ幸いです。前もって感謝します。

4

5 に答える 5

13

これとまったく同じ問題 (getElementsByTagName() を使用して XML ファイル内の「オプションの」ノードを取得する) があったので、経験から解決方法を知ることができます。一致するノードが見つからない場合、getElementsByTagNameは null を返さないことが判明しました。代わりに、長さゼロの NodeList オブジェクトを返します。

ご想像のとおり、ノードの内容をフェッチする前に XML ファイルにノードが存在するかどうかを確認する正しい方法は、次のようなものです。

NodeList nl = element.getElementsByTagName("myTag");
if (nl.getLength() > 0) {
    value = nl.item(0).getTextContent();
}

タグが見つからない場合に備えて、必ず「デフォルト」値を指定してください。

于 2013-11-04T16:18:04.787 に答える
1

あなたの要件は非常に不明確ですjavax.xml.xpathが、パッケージを使用して XML ドキュメントをXML パス言語 (XPath)で解析する可能性が非常に高くなります。

見て:

ただし、直面している特定の問題ではなく、解決しようとしている一般的な問題を説明するようにしてください。しかし、そうすると、1.おそらくより良い答えが得られ、2.現在選択されているパスが最適ではない可能性があります.

于 2010-07-10T03:03:49.300 に答える
1

NodeLists が null ではなく、空である可能性があります。このようにコードを変更してみて、何が起こるかを確認できますか?

NodeList restElmLst = fstelm_Note.getElementsByTagName("rest");
if (restElmLst != null && !restElmLst.isEmpty())
{
    Element restElm = (Element)rests.item(0);
...

など(私はコンパイラの前にいないので、構文などを再確認してください。)

于 2010-07-10T02:21:07.363 に答える