3

XMLファイルを再帰的に繰り返し、HashMapのHashMapにデータを取り込むコードを書いています。ハッシュマップにデータを入力できましたが、問題ないようです。ただし、このコマンドを実行すると

 System.out.println(map.containsKey("Mary"));

その常に誤り。なぜそれが常にfalseを返すのか本当にわかりません。再帰コードとハッシュマップの内容も投稿しました

map.toString() 
map is { Mary
    ={24
        ={established
            ={western
                ={Profile=m}}, torn-down
            ={western
                ={Profile=b}, eastern
                ={Profile=m}}}, 44
        ={established
            ={western
                ={Profile=g}, eastern
                ={Profile=s}}, torn-down
            ={western
                ={Profile=j}, western
                ={Profile=f}}}}, Martha
    ={24
        ={established
            ={western
                ={Profile=a}}, torn-down
            ={western
                ={Profile=b}, eastern
                ={Profile=n}}}, 44
        ={established
            ={western
                ={Profile=s}, eastern
                ={Profile=j}}, torn-down
            ={western
                ={Profile=k}, eastern
                ={Profile=g}}}}}

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

NodeList l = doc.getElementsByTagName("Branches");
        Node n = l.item(0);
        map = new HashMap();
        recurse(n, map);

private void recurse(Node n, HashMap map){
if (n.hasChildNodes()){
    NodeList nl = n.getChildNodes();

    for(int i= 0; i< nl.getLength(); i++){
        Node node = nl.item(i);

        if(node.getNodeType() == Node.ELEMENT_NODE){
            if (!node.getNodeName().equals("Profile") ){

                map.put(node.getFirstChild().getNodeValue(), new HashMap());

                recurse(node, (HashMap)map.get(node.getFirstChild().getNodeValue()));
            }
            else {

                map.put("Profile", node.getFirstChild().getNodeValue());
                }


            }
        }       
    }

}   

ありがとう!

4

1 に答える 1

2

OPによって要求されたように-そしてコメントでの議論が彼の問題を解決したので-私はそれを答えとして包んでいます-将来の読者のために:

Stringまず、キーが実際にオブジェクトであるかどうかを確認する必要があります。次の行を追加することでそれを行うことができます:

System.out.println(map.keySet().iterator().next().getClass());

次に、キーが実際にStringsであることを確認した後、非表示の文字があるか、空白が不要かどうかを確認したいので、次の行を追加して確認します。

String s = (String)map.keySet().iterator().next(); 
System.out.println("val=" + s + " length=" + s.length());

実際に非表示の文字がある場合は、長さが一致しないため、それがわかります。

それが本当に理由である場合[そして、OPが言ったように]、この文字を除外するためにXMLを読み取るときに文字列を処理する必要があります。

また、補足として、raw型の使用は避けることをお勧めします。可能な場合は常に、ジェネリック型を使用することをお勧めします。それはあなたにもっと読みやすいコードと両方の型安全性の両方を与えるでしょう!
無制限のネストが必要な場合は、複合デザインパターンを使用してそれを実現します。

于 2012-04-19T17:25:08.170 に答える