美文网首页
使用java解析xml

使用java解析xml

作者: 是瑞瀛呀 | 来源:发表于2018-08-22 10:13 被阅读0次

本文使用javax.xml.parsers包下的DocumentBuilderFactory构建解析工具解析xml。

首先我们通过工厂构建一个Document

private static File file = new File("e:/data.xml");
public Document build(){
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = null;
        Document document = null;
        try {
            docBuilder = dbFactory.newDocumentBuilder();
            document = docBuilder.parse(file);
        } catch (SAXException | ParserConfigurationException | IOException e) {
            e.printStackTrace();
        }
        assert document != null;
        document.normalize();
        return document;
    }

解析数据

//通过build函数拿到document对象
Document document = build();
//获取到根节点
Element root = document.getDocumentElement();
//通过根节点获取根节点下的所有节点
NodeList childNodes = root.getChildNodes();
//获取根节点的子节点个数
int length = childNodes.getLength();

//创建一个存储数据的容器,用来存储解析的结果
Map<String, Object> data = new HashMap<>();
//如果根节点下包含大于一个的节点,递归获取数据
if(length > 1){
    data.put(root.getTagName(),readXmlList(childNodes));
}else{
    //根节点下就一个节点,直接获取
    Node item = childNodes.item(0);
    String nodeName = item.getNodeName();
    String textContent = item.getTextContent();
    Map<String, String> childMap = new HashMap<>();
    childMap.put(nodeName,textContent);
    data.put(root.getTagName(),childMap);
}

递归获取数据

private Map<String,Object> readXmlList(NodeList nodeList){

        final Map<String, Object> result = new HashMap<>();

        int length = nodeList.getLength();
        for(int i=0;i<length;i++){
            Node node = nodeList.item(i);
            if(node.getNodeType()==Node.ELEMENT_NODE) {
                NodeList childNodes = node.getChildNodes();
                if(childNodes.getLength() > 1){
                    result.put(node.getNodeName(),readXmlList(childNodes));
                }else{
                    String nodeName = node.getNodeName();
                    String textContent = node.getTextContent();
                    result.put (nodeName,textContent);
                }
            }
        }
    return result;
}

这种方式可以适配多个子节点或多级子节点情况。
create by 旗红

相关文章

网友评论

      本文标题:使用java解析xml

      本文链接:https://www.haomeiwen.com/subject/lodeiftx.html