【问题标题】:Store an XML into a HashMap将 XML 存储到 HashMap 中
【发布时间】:2017-05-19 09:29:22
【问题描述】:

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

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

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

附注我还在学习编程,所以要慷慨:)

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();
        }
    }

}

【问题讨论】:

    标签: java xml dom xml-parsing


    【解决方案1】:

    如果您不想重复,则可以仅在获得节点值时将节点添加到地图中。这将忽略子元素,直到它们自己呈现它们的值。

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

    【讨论】:

    • 感谢您的回复!但是,这并不能解决这里的问题..我没有任何空节点......所以,我得到了相同的输出:(
    • 如何检查它是否是文本子项,然后才将父项添加到哈希映射中? (见示例)
    • 我们在这里使用的列表是什么?但是当我这样做并将其提供给 printNode() 方法时,我将所有节点类型都设为 ELEMENT_TYPE 并且它们都确实有子节点,而事实并非如此...... >ele.getElementsByTagName("*")
    • 检查所有children的类型,只有(child.getNodeType() == Node.TEXT_NODE)时才将parent加入HashMap
    • 由于某种原因,每个节点都是错误的......所有子节点,父节点都将ELEMENT_NODE作为它们的NodeType
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    相关资源
    最近更新 更多