1

このように整理された XML ファイルがあります。各ノードの下の項目は常にアルファベット順です。

<xml>
    <node id="2">
        <jack>Jack wrote this.</jack>
        <john>John wrote this.</john>
    </node>

    <node id="4">
        <jack>Jack wrote this.</jack>
        <jill>Jill wrote this.</jill>
    </node>

    <node id="9">
        <jack>Jack wrote this.</jack>
        <james>James wrote this.</james>
        <jill>Jill wrote this.</jill>
        <john>John wrote this.</john>
    </node>
</xml>

ご覧のとおり、すべての名前が各ノードの下にあるわけではありません。たとえば、 では<node id="4">、ジョンとジェームズは何も書いていません。上記の例では、プログラムが次のようなものを返すようにします。

James did not write 2, 4
Jill did not write 2
John did not write 4

誰が何を書いていないかを追跡する必要があります。現在、次のようにドキュメントを解析しています。

private static String getTagValue(final Element element)
{
    String theId="";
    if (element.getTagName().startsWith("node")){

        theId = element.getAttribute("id");
        return theId;
    }
    return theId;
}


private static void readXML(String fileName){

    for (int index = 0; index < nodeList.getLength(); index++){

                Node node = nodeList.item(index);
                Element element = (Element) node;

                if (node.getNodeType() == Node.ELEMENT_NODE){

                    // This prints the node id
                    if(getTagValue(element)!=""){
                        System.out.println(getTagValue(element)+" = I am the node id number!");
                    }

                    // This prints the name
                    else{
                        System.out.println(element.getTagName()+" = I am the name!");
                    }
                }
            }
}

私がやりたいのは、各ノードの下の要素を、すべての名前を含む「コントロール」リストと比較し、名前が含まれていない場合は、名前とその親ノードを返すことです。

実際には、私が扱っている XML ははるかに大きいため、パフォーマンスが重要になりますが、概念は同じです。どんな助けでも素晴らしいでしょう。

4

2 に答える 2

1

2セット維持。1 つは、すべての名前のマスター セットです ( A)。2 つ目は、反復ごとに作成する、質問に回答した人々のセットです ( B)。すると、答えなかった人はA - BになりますCollection#removeAll(Collection c)

A.removeAll(B);

回答者が回答しなかった回答を 1 行で出力したいとおっしゃいました。Map<String, List<Integer>>これを行うには、人の名前を回答しなかった質問番号のリストにマップするマップ ( ) を維持できます。A.removeAll(B)これを行うには、1 回の反復の最後にの結果を調べます。

したがって、すべてのノードのループ処理が完了すると、回答されなかった質問のリストに関連付けられた各名前を示すマップが作成されます。次に、このマップを反復処理して、必要なものを印刷できます。

于 2012-10-09T21:18:29.507 に答える
0

機能の観点から、機能は次のようになると思います。

  • For Each Node ノードは、xml ファイル内のすべての子を取得します
  • 各子ノードの名前をコントロール サンプル ノードの名前と比較します。
  • ノードの名前が一致する場合、子ループを中断します
  • コントロール グループの for ループが完了するまで名前が一致しない場合、コントロール グループの print ステートメント名が見つかりません
于 2012-10-09T21:19:41.450 に答える