如何从XML文档Java获取键值对

时间:2015-08-18 18:43:34

标签: java xml xml-parsing

我有一个XML文档,我想从中检索此XML文档中的键和值。但是我无法获得两者,我意识到我应该使用Map的数据类型,但我不确定如何实现这一点。

示例:

我有以下XML文件:

<?xml version="1.0"?>
    <config>
        <Request name="ValidateEmailRequest">
            <requestqueue>emailrequest</requestqueue>
            <responsequeue>emailresponse</responsequeue>
        </Request>
        <Request name="CleanEmail">
            <requestqueue>Cleanrequest</requestqueue>
            <responsequeue>Cleanresponse</responsequeue>
        </Request>
    </config>

我想编写一个解析此文件的方法,并返回XML的节点(键)和值(值)的键值对。

如[requestqueue,emailrequest] [responsequeue,emailresponse]等......

我现在有什么:

public Map<String, String> parseXML(File f) throws Exception {

    String xml = FileUtils.readFileToString(f);

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();

    Document document = builder.parse(new InputSource(new StringReader(xml)));
    Element rootElement = document.getDocumentElement();

    // I'm stuck...

    return null;
}

非常感谢任何帮助或帮助,谢谢。

修改

我做了一些研究,我找到了一些可以打印出价值的东西,但只有一个键“返回”

@Test
public void testConverter() throws Exception {
    String xml = ("xmlDir/request.xml");
    Map<String,String> map = convertNodesFromXml(xml);

    for(Map.Entry<String, String> entry: map.entrySet()) {
        String key = entry.getKey(); 
        String value = entry.getValue();

        logger.debug("Key: "+key+" Value: "+value);
    }

}



public static Map<String, String> convertNodesFromXml(String xml) throws Exception {

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document document = db.parse(xml);

    Element doc = document.getDocumentElement();
    logger.debug(doc.getFirstChild());

    return createMap(document.getDocumentElement());
}

public static Map<String, String> createMap(Node node) {
    Map<String, String> map = new HashMap<String, String>();
    NodeList nodeList = node.getChildNodes();
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node currentNode = nodeList.item(i);
        if (currentNode.hasAttributes()) {
            for (int j = 0; j < currentNode.getAttributes().getLength(); j++) {
                Node item = currentNode.getAttributes().item(i);
                map.put(item.getNodeName(), item.getTextContent());
            }
        }
        if (node.getFirstChild() != null && node.getFirstChild().getNodeType() == Node.ELEMENT_NODE) {
            map.putAll(createMap(currentNode));
        } else if (node.getFirstChild().getNodeType() == Node.TEXT_NODE) {
            map.put(node.getLocalName(), node.getTextContent());
        }
    }
    return map;
}

输出:

2015-08-18 15:01:31,651 : Key: Return Value: 



    136
    125
    SEPTEMBER
    250


    OCTOBER
    250
    125
    136


    136
    125
    250
    APRIL


    136
    JUNE
    250
    125


    MAY
    136
    250
    125


    136
    250
    125
    JANUARY


    136
    125
    250
    MARCH


    250
    AUGUST
    136
    125

  3000

    136
    125
    250
    DECEMBER


    136
    JULY
    125
    250


    136
    125
    FEBRUARY
    250

  1500
  555-11-2222

    125
    136
    NOVEMBER
    250

  1632


  1
  22000
  1
  22000




  1970-01-01


  555-11-2222


      CA

2 个答案:

答案 0 :(得分:0)

函数getChildNodes()https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html#getChildNodes()返回一个包含该节点子节点的节点列表。也许您使用该功能来遍历您的nodetree。 或者,您可以使用像Jaxb这样的框架将xml映射到Java Pojos。有了pojos,你可以建立你的地图

答案 1 :(得分:0)

你看看java documentation

首先,我将尝试

NodeList nodeList = rootElement.getElementsByTagName("equestqueue");

稍后我将遍历此List(也查看api)并查找属性,值等...