我试图显示所有记录,但它只显示最后一条记录,因为它的值每次都被覆盖。如何解决这个问题?
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中存储所有值?
答案 0 :(得分: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());
每次都保持键相同,如“No No”等,所以每次都会覆盖值。将地图放入列表中,最后将该列表发送到您的方法。
答案 1 :(得分: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");
}
答案 2 :(得分:0)
您需要将值列表传递给generateCSVfile()。现在,你只通过了一行。
一种方法是将所有地图放在一个列表中并将列表传递给generateCSVfile。
但我建议您创建一个新类来保存值。假设一个名为Row
的类将保存您的值,并将List传递给generateCSVfile()
答案 3 :(得分:0)
您需要地图对象列表
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){
}
}