使用JAVA使用XPATH将xml值存储为Map

时间:2018-07-19 13:00:51

标签: java xml xpath

我正在使用XPATH解析xml文档,请在下面找到xml

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <bookEvent>
            <bookName>harry_potter</bookName>
            <bookEntity>comic</bookEntity>
            <bookEntityId>10987645</bookEntityId>
            <bookParameter>
                <name>Name1</name>
                <value>value1</value>
            </bookParameter>
            <bookParameter>
                <name>Name2</name>
                <value>value2</value>
            </bookParameter>
            <bookParameter>
                <name>Name3</name>
                <value>value3</value>
            </bookParameter>
            <bookParameter>
                <name>Name4</name>
                <value>value4</value>
            </bookParameter>
            <bookParameter>
                <name>Name5</name>
                <value>value5</value>
            </bookParameter>
        </bookEvent>
    </soap:Body>
</soap:Envelope>

在这里,我想将BookParameters转换为Map,如下所示

{"Name1":"value1","Name2":"value2" etc}

我尝试了以下代码,但可以获取地图,但格式不正确

      try{
        Map<String,String> eventParameters = new HashMap<>();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse("book.xml");
        XPathFactory xPathfactory = XPathFactory.newInstance();
        XPath xpath = xPathfactory.newXPath();
        NodeList nodeList = (NodeList)xpath.compile("//bookEvent//eventParameter").evaluate(doc, XPathConstants.NODESET);
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            if(node.hasChildNodes()) {
                NodeList childNodes = node.getChildNodes();
                for (int j = 0; j < childNodes.getLength(); j++) {
                    Node childNode = childNodes.item(j);
                    if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                        System.out.println(childNode.getNodeName()+"::"+childNode.getNodeValue()+"::"+childNode.getTextContent());
                        eventParameters.put(childNode.getTextContent(),childNode.getTextContent());
                    }
                }
            }
        }
        System.out.println("print map::"+eventParameters);
    } catch (Exception e) {
        e.printStackTrace();
    }

输出看起来像这样

print map::{Name3=Name3, Name4=Name4, value5=value5, Name5=Name5, value2=value2, value1=value1, value4=value4, value3=value3, Name1=Name1, Name2=Name2}

请有人指导我从xml创建一个下面的地图,任何帮助都是可取的。

{"Name1":"value1","Name2":"value2" etc}

2 个答案:

答案 0 :(得分:1)

您可以在XPath 3.1中将其作为单一代码来实现:

map:merge(//bookParameter!map{string(name): string(value)}) 
   => serialize(map{'method':'json'})

您可以通过安装Saxon-HE 9.8(开源)从Java运行XPath 3.1

答案 1 :(得分:1)

使用以下代码:

import java.io.File;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXMLFile {

    public static Map<String,String> hMap = new LinkedHashMap<>();
    public static void main(String argv[]) {

        try {

            File fXmlFile = new File("C:\\Users\\jaikant\\Desktop\\QUESTION.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();

            NodeList nodeList = doc.getElementsByTagName("bookParameter");

            for (int parameter = 0; parameter < nodeList.getLength(); parameter++) {
                Node node = nodeList.item(parameter);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) node;
                    String name = eElement.getElementsByTagName("name").item(0).getTextContent();
                    String value = eElement.getElementsByTagName("value").item(0).getTextContent();
                    hMap.put(name, value);

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

        hMap.forEach((h,k) -> {
            System.out.println(h + ":" + k);
        });
    }

}

它将完全打印您要查找的内容。