XML解析器跳过重复值JAVA

时间:2015-12-04 23:23:31

标签: java xml parsing xml-parsing

我编写了一个XML解析器,它解析XML文档并返回Map和ID以及Name。出于某种原因,它正在跳过重复的ID。

编辑:

public static Multimap<String,String> getMap(String pathToFile) {

    Multimap<String,String> map = new ArrayListMultimap.create();

    try {

        Document doc = getDocument(pathToFile);
        NodeList nList = doc.getElementsByTagName("Definition");

        for(int i=0;i<nList.getLength();i++) {
            Node nNode = nList.item(i);
            if(nNode.getNodeType() == Node.ELEMENT_NODE) {
                Element eElement = (Element) nNode;
                String nodeID = eElement.getElementsByTagName("Key").item(0).getTextContent(); 
                NodeList n = eElement.getElementsByTagName("Value");

                for(int j=0;j<n.getLength();j++) {
                    String name = n.item(0).getTextContent();

                    if(name.equalsIgnoreCase("")) {
                        name = "blank"; // check for empty values
                    }
                    map.put(nodeID, name);
                }
            }
        }
    } 
    catch (IOException e) {
        e.printStackTrace();
    }
    return map;
}


public static List<String> getIDList(String pathToFile) {
    List<String> list = new ArrayList<String>();

    Multimap<String, String> map = getMap(pathToFile);

    for(String id : map.keySet()) {
        list.add(id);
    }
    return list;
}

我的问题是,为什么会发生这种情况?为什么重复被忽略?

1 个答案:

答案 0 :(得分:0)

因为,它是一个地图:关键是唯一的:在地图中,如果你放(ID,“AA”);并放(ID,“BB”);只有ID-“BB”仍然存在。这是理念:地图将键映射到唯一值。

所以不要使用地图。

您可以在Set,Vector或List中使用某些对,如下所示:

组&LT;对&lt;字符串,字符串&gt;&gt;或列表&lt;对&gt;,向量&lt;对&LT;字符串,字符串&GT;&GT;

或者你可以使用MultiMap(带有键和多个值的地图):

How to create a Multimap<K,V> from a Map<K, Collection<V>>?

Multimap示例:

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

Multimap<String,String> mm=ArrayListMultimap.create(); //

mm.put("AAA", "123");
mm.put("AAA", "444");
mm.put("AAA", "555");
mm.put("BBB", "777");

// to use keySet
mm.keySet();

// getting values
Collection<String> values=mm.get("AAA");

for (String a_value: values) System.out.println("VALUE:"+a_value);

如果你想使用Pair,你必须重新创建get,keySet,...

Pair the_pair=new Pair(ID,Name);

礼貌:A Java collection of value pairs? (tuples?)

public class Pair<L,R> implements java.io.Serializable  {

  private final L left;
  private final R right;

  public Pair(L left, R right) {
    this.left = left;
    this.right = right;
  }

  public L getLeft() { return left; }
  public R getRight() { return right; }

  @Override
  public int hashCode() { return left.hashCode() ^ right.hashCode(); }

  @Override
  public boolean equals(Object o) {
    if (o == null) return false;
    if (!(o instanceof Pair)) return false;
    Pair pairo = (Pair) o;
    return this.left.equals(pairo.getLeft()) &&
           this.right.equals(pairo.getRight());
  }

}