将XML存储到HashMap中

时间:2017-05-19 09:29:23

标签: java xml dom xml-parsing

我需要将XML的文本节点存储在HashMap中,使得键是标记名,值是Tag的内容。

我可以使用以下代码部分执行此操作。然而问题是,即使我能够获得文本节点,但我也可以获得其他(或冗余)标签。我只需要从XML中获取SimpleElements(无子元素)中的数据,并忽略complexElements(其中包含更多XML标记)。

我无法这样做,因为每当我尝试获取节点类型时,所有节点都会因某种原因返回相同的类型。

P.S。我还在学习编码,所以要慷慨:)

public class TextNodes {

    private static HashMap<String, String> printNote(NodeList a) {

        HashMap<String, String> map = new HashMap<String, String>();
        for (int i = 0; i < a.getLength(); i++) {
            Node x = a.item(i);

            if (x.hasChildNodes() == true) {
                int y = 1;
                String key = x.getNodeName();
                String tempkey = "";
                if (map.containsKey(key)) {
                    do {
                        y++;
                        tempkey = key + "_" + y;
                    } while (map.containsKey(tempkey) == true);
                    map.put(tempkey, x.getTextContent().trim());
                    tempkey = "";
                } else {
                    map.put(key, x.getTextContent().trim());
                }
            }
        }

        return map;
    }

    public static void main(String[] args) {
        try {
            File input = new File("test1.txt");
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(input);
            doc.getDocumentElement().normalize();
            Element ele = doc.getDocumentElement();
            HashMap<String, String> map = new HashMap<String, String>();
            if (doc.hasChildNodes()) {
                map = printNote(ele.getElementsByTagName("*"));

            }

            System.out.println(map.keySet());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

1 个答案:

答案 0 :(得分:0)

如果您不想要重复,只有在到达节点值时才可以将节点添加到地图中。这将忽略子元素,直到它们自己呈现其值。

  Node child = list.item(i);
        if (child.getNodeType() == Node.TEXT_NODE)
            textContent.append(child.getTextContent());
    }