【问题标题】:XML parser skipping duplicate values JAVAXML解析器跳过重复值JAVA
【发布时间】:2015-12-04 23:23:31
【问题描述】:

我编写了一个 XML 解析器,它解析一个 XML 文档并返回一个 Map of and 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;
}

我的问题是,为什么会这样?为什么重复被忽略?

【问题讨论】:

    标签: java xml parsing xml-parsing


    【解决方案1】:

    因为,它是一个 Map:键是唯一的:在一个 Map 中,如果你把(ID,"AA");并放(ID,“BB”);只剩下 ID-“BB”。这就是哲学: Map 将键映射到唯一值。

    所以不要使用地图。

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

    Set>,或List,Vector>

    或者你可以使用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());
      }
    
    }
    

    【讨论】:

    • 如果我使用这个类,我就不会像使用 Map 那样拥有 put、keySet、value 等方法
    • 与pair,你需要另一个周围的集合。或使用多图:请参阅我的答案。对你有帮助吗?
    • 感谢它的帮助,我什至不知道地图必须包含唯一键。这是有道理的,因为当您调用 map.get(key) 时,选择哪个键?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-11-26
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多