1

すべてのレコードを表示しようとしていますが、値が毎回上書きされるため、最後のレコードのみが表示されます。この問題を解決するにはどうすればよいですか?

File fXmlFile = new File("d:/formdata.xml");

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();

            System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
            NodeList nList = doc.getElementsByTagName("record");
            System.out.println("----------------------------");
            for (int temp = 0; temp < nList.getLength(); temp++) {

                Map<String, Object> map = new HashMap<String, Object>();
                Node nNode = nList.item(temp);

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

                    Element eElement = (Element) nNode;

                    map.put("Item No", eElement.getElementsByTagName("item_no").item(0).getTextContent());
                    map.put("Description", eElement.getElementsByTagName("description").item(0).getTextContent());
                    map.put("price", eElement.getElementsByTagName("price").item(0).getTextContent());
                    map.put("base qty", eElement.getElementsByTagName("base_qty").item(0).getTextContent());
                    map.put("Var qty", eElement.getElementsByTagName("var_qty").item(0).getTextContent());



                    generateCsvFile("E:\\testCSV.csv", map);
                }
              }

generateCSVfile() を呼び出すとき

private static void generateCsvFile(String sFilename, Map<String, Object> test) {
    try {
        FileWriter writer = new FileWriter(sFilename,true);

        Iterator iterator = test.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry mapEntry = (Map.Entry) iterator.next();
            System.out.println("key: " + mapEntry.getKey() + ", value:" + mapEntry.getValue());
            writer.append(mapEntry.getKey() + " = " + mapEntry.getValue());
            writer.append(",");
            iterator.remove();
        }
        writer.flush();
        writer.close();
    }

すべての値を Map に格納するにはどうすればよいでしょうか?

4

4 に答える 4

0

私が見るようにMap、値 - データの場合、キーは列を表します。したがって、すべてのを同じキーに入れます。

基本クラスを作成してLine使用することをお勧めしますList<Line>

class Line{
 private String ItemNo = "";
 private String Description = "";
 private String price = "";
 private String baseQty = "";
 private String VarQty = "";

 //getters/setters
}

 ...

 List<Line> lines = new ArrayList<Line>();

その代わり:

map.put("Item No", eElement.getElementsByTagName("item_no").item(0).getTextContent());
map.put("Description", eElement.getElementsByTagName("description").item(0).getTextContent());
map.put("price", eElement.getElementsByTagName("price").item(0).getTextContent());
map.put("base qty", eElement.getElementsByTagName("base_qty").item(0).getTextContent());
map.put("Var qty", eElement.getElementsByTagName("var_qty").item(0).getTextContent());

書きます:

 Line line = new Line();
 line.setItemNo(eElement.getElementsByTagName("item_no").item(0).getTextContent());
 line.setDescription(eElement.getElementsByTagName("description").item(0).getTextContent());
 ...
 lines.add(line);

メソッドでは、generateCsvFile次のように記述します。

FileWriter writer = new FileWriter(sFilename,true);
writer.append("Item No, Description, .....");// add header

リストをループして実行し、次のような行を追加します。

for(Line line : lines){ 
writer.append(line.getItemNo()).append(","); 
writer.append(line.getDescription()).append(","); 
...
writer.append("\n");
} 
于 2013-10-16T12:42:57.423 に答える
0

Map オブジェクトのリストが必要です

List< Map<String, String>> list = new ArrayList<Map<String,String>>();

for (int temp = 0; temp < nList.getLength(); temp++) {
     Map<String, String> map = new HashMap<String, String>();
     Node nNode = nList.item(temp);
     if (nNode.getNodeType() == Node.ELEMENT_NODE) {
           Element eElement = (Element) nNode;
           map.put("Item No", eElement.getElementsByTagName("item_no").item(0).getTextContent());
           map.put("Description", eElement.getElementsByTagName("description").item(0).getTextContent());
           map.put("price", eElement.getElementsByTagName("price").item(0).getTextContent());
           map.put("base qty", eElement.getElementsByTagName("base_qty").item(0).getTextContent());
           map.put("Var qty", eElement.getElementsByTagName("var_qty").item(0).getTextContent());
           list.add(map);               
      }
}

generateCsvFile("E:\\testCSV.csv", list );

generateCSVfile() メソッドは次のようになります

private static void generateCsvFile(String sFilename, List< Map<String, String>>  test) {
        try {
            FileWriter writer = new FileWriter(sFilename,true);
            for (Map<String, String> map : test) {          

            Iterator iterator = map.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<String,String> mapEntry = (Map.Entry<String,String>) iterator.next();
                System.out.println("key: " + mapEntry.getKey() + ", value:" + mapEntry.getValue());
                writer.append(mapEntry.getKey());
                writer.append(mapEntry.getValue());
                writer.append(",");
                iterator.remove();
            }
            }
            writer.flush();
            writer.close();
        }catch(Exception e){

        }
    }
于 2013-10-16T12:47:13.850 に答える
0

必要なのは、値のリストを generateCSVfile() に渡すことです。現在、1 行だけを渡しています。

それを行う 1 つの方法は、すべてのマップをリストに入れて、そのリストを generateCSVfile に渡すことです。

ただし、値を保持する新しいクラスを作成することをお勧めします。Row値を保持するクラスを呼び出し、List を generateCSVfile() に渡します。

于 2013-10-16T12:46:05.680 に答える
0
map.put("Item No", eElement.getElementsByTagName("item_no").item(0).getTextContent());
map.put("Description", eElement.getElementsByTagName("description").item(0).getTextContent());
map.put("price", eElement.getElementsByTagName("price").item(0).getTextContent());
map.put("base qty", eElement.getElementsByTagName("base_qty").item(0).getTextContent());
map.put("Var qty", eElement.getElementsByTagName("var_qty").item(0).getTextContent());

「アイテム番号」などのキーを毎回同じに保つため、毎回値が上書きされます。マップをリストに入れ、最後にそのリストをメソッドに送信します。

于 2013-10-16T12:40:28.490 に答える