Dom4j解析XML文本,遍历指定节点下的节点内容和属性,并存入List<Map<String,Object>

Dom4j解析XML文本,遍历指定节点下的节点内容和属性

Dom4j简单介绍
dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。
Dom4j基本知识点
  • 获得Document对象
1.读取XML文件,获得document对象              
                  SAXReader reader = new SAXReader();                
       Document   document = reader.read(new File("csdn.xml"));  
2.解析XML形式的文本,得到document对象.  
                  String text = "<csdn></csdn>";              
                  Document document = DocumentHelper.parseText(text);  
3.主动创建document对象.  
                 Document document = DocumentHelper.createDocument();             //创建根节点  
                 Element root = document.addElement("csdn"); 
  • 操作节点对象
1.获取文档的根节点.  
      Element root = document.getRootElement();  
    2.取得某个节点的子节点.  
      Element element=node.element(“四大名著");  
    3.取得节点的文字  
        String text=node.getText();  
    4.取得某节点下所有名为“FourFamousNovels”的子节点,并进行遍历.  
       List nodes = rootElm.elements("FourFamousNovels");  
         for (Iterator it = nodes.iterator(); it.hasNext();) {     
      Element elm = (Element) it.next();   
    // do something  
}  
     5.对某节点下的所有子节点进行遍历.     
      for(Iterator it=root.elementIterator();it.hasNext();){       
        Element element = (Element) it.next();       
       // do something 
 }  
    6.在某节点下添加子节点  
      Element elm = newElm.addElement("水浒传");  
    7.设置节点文字.elm.setText("及时雨-宋江");  
    8.删除某节点.//childElement是待删除的节点,parentElement是其父节点  parentElement.remove(childElment);
    9.添加一个CDATA节点.Element contentElm = infoElm.addElement("content");contentElm.addCDATA(“cdata区域”); 
  • 操作节点对象的属性
1.取得某节点下的某属性:Element root=document.getRootElement();//属性名 
                    Attribute attribute=root.attribute("id"); //ID属性对象
2.取得属性的文字:String text=attribute.getText();  
3.删除某属性:Attribute attribute=root.attribute("size");
            root.remove(attribute);  
4.遍历某节点的所有属性:Element root=document.getRootElement();   
       for(Iterator it=root.attributeIterator();it.hasNext();){        
           Attribute attribute = (Attribute) it.next();          
           String text=attribute.getText();          
           System.out.println(text);   
  }  
5.设置某节点的属性和文字:newMemberElm.addAttribute("name","四大名著");  
6.设置属性的文字:Attribute attribute=root.attribute("name");          
               attribute.setText("水浒传");  
实例:遍历指定节点下的节点内容和属性
  • 获取Document对象
    /**
     * @方法功能描述: 读取XML形式的文本,获取document对象
     * @方法返回类型:Document
     * @param xmlText
     *            xml字符串
     * @return
     */
    public static Document getDocumentFromText(String xmlText) {
        Document document = null;
        try {
            document = DocumentHelper.parseText(xmlText);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return document;
    }
  • 根据document对象获取根节点
    /**
     * @方法功能描述: 根据document对象获取根节点
     * @方法返回类型:Element
     * @param document
     * @return
     */
    public static Element getRootElement(Document document) {
        Element element = null;
        if (Objects.isNotNull(document)) {
            element = document.getRootElement();
        }
        return element;
    }
  • 根据DOM树路径,获取指定节点(单一节点)
    /**
     * @方法功能描述: 根据DOM树路径,获取指定节点的子节点(包含该指定节点)
     * @方法返回类型:List<Element>
     * @param xmlText
     * @param xPath
     * @return
     */
    @SuppressWarnings("unchecked")
    public static List<Element> getAppointedElementList(String xmlText, String xPath) {
        // 定义list
        List<Element> elements = new ArrayList<Element>();
        // 获取document对象
        Document document = getDocumentFromText(xmlText);
        // 获取根节点
        Element rooElement = getRootElement(document);
        if (Objects.isNull(xPath) || Objects.isEmpty(xPath)) {
            elements.add(rooElement);
            return elements;
        } else {
            elements = rooElement.selectNodes(xPath);
            if (elements.size() == 0) {
                logger.error("xPath(DOM树路径)出现错误!");
            }
        }
        return elements;
    }
  • 遍历当前节点元素下面的所有(元素的)子节点
    /**
     * 遍历当前节点元素下面的所有(元素的)子节点
     * 
     * @param node
     */
    public static void arrayNodes(Map<String, Object> nodeMap, Element node, Element root) {
        System.out.println("----------------------------");
        // 当前节点的名称、文本内容和属性
        System.out.println("当前节点名称:" + node.getName());// 当前节点名称
        if (!(node.getTextTrim().equals(""))) {
            System.out.println("当前节点的内容:" + node.getTextTrim());// 当前节点名称
        }
        String nodeName = node.getName();
        String nodeValue = node.getTextTrim();
        nodeMap.put(nodeName, nodeValue);
        // 当前节点下面子节点迭代器
        @SuppressWarnings("unchecked")
        Iterator<Element> it = node.elementIterator();
        // 遍历
        while (it.hasNext()) {
            // 获取某个子节点对象
            Element e = it.next();
            // 对子节点进行遍历
            arrayNodes(nodeMap, e, root);
        }
    }
  • 解析XML,并将节点为KEY,值为VALUE,存入Map
    /**
     * @方法功能描述: 解析XML,并将节点为KEY,值为VALUE,存入Map<String,Object>
     * @方法返回类型:Map<String,Object>
     * @param xmlText
     * @param xPath
     * @return
     */
    @SuppressWarnings("unchecked")
    public static Map<String, Object> getAppointedElementTextMap(String xmlText, String xPath) {
        Map<String, Object> elementMap = new HashMap<String, Object>();
        // 定义list
        List<Element> elements = new ArrayList<Element>();
        // 获取document对象
        Document document = getDocumentFromText(xmlText);
        // 获取根节点
        Element rooElement = getRootElement(document);
        if (Objects.isNull(xPath) || Objects.isEmpty(xPath)) {
            elements.add(rooElement);

        } else {
            elements = rooElement.selectNodes(xPath);
            if (Objects.isNotNull(elements)) {
                for (Element element : elements) {
                    arrayNodes(elementMap, element, rooElement);
                }
            }
            if (elements.size() == 0) {
                logger.error("xPath(DOM树路径)出现错误!");
            }
        }
        return elementMap;
    }
  • 解析XML,并将节点为KEY,值为VALUE,存入List
    /**
     * @方法功能描述: 解析XML,并将节点为KEY,值为VALUE,存入List<Map<String,Object>>
     * @方法返回类型:Map<String,Object>
     * @param xmlText
     * @param xPath
     * @return
     */
    @SuppressWarnings("unchecked")
    public static List<Map<String, Object>> getAppointedElementTextList(String xmlText, String xPath) {
        List<Map<String, Object>> elementList = new ArrayList<Map<String, Object>>();
        Map<String, Object> elementMap = new HashMap<String, Object>();
        elementMap = new HashMap<String, Object>();
        // 定义list
        List<Element> elements = new ArrayList<Element>();
        // 获取document对象
        Document document = getDocumentFromText(xmlText);
        // 获取根节点
        Element rooElement = getRootElement(document);
        if (Objects.isNull(xPath) || Objects.isEmpty(xPath)) {
            elements.add(rooElement);

        } else {
            elements = rooElement.selectNodes(xPath);
            if (Objects.isNotNull(elements)) {
                for (Element element : elements) {
                    Element elementParent = element.getParent();
                    elementMap = new HashMap<String, Object>();
                    arrayNodes(elementMap, element, rooElement);
                    List<Attribute> attributes = elementParent.attributes();
                    if (attributes.size() > 0) {
                        for (Attribute attr : attributes) {
                            // 将属性名称(key)和属性值(value)添加到map对象中
                            elementMap.put(attr.getName(), attr.getValue());
                        }
                    } else {
                        logger.warn("该节点没有任何属性节点!");
                    }
                    elementList.add(elementMap);
                }
            }
            if (elements.size() == 0) {
                logger.error("xPath(DOM树路径)出现错误!");
            }
        }

        return elementList;
    }
好的,可以。首先,需要使用Java中的dom4j库来解析XML。然后,使用以下代码来解析Map<List<Map<String, Object>>>结构的XML: ``Document document = DocumentHelperText(xmlString); Element root = document.getRootElement(); Map<String, List<Map<String, Object>>> map = new HashMap<>(); for (Iterator j = root.elementIterator(); j.hasNext();) { Element el = (Element) j.next(); List<Map<String, Object>> list = new ArrayList<>(); for (Iterator i = el.elementIterator(); i.hasNext();) { Element e = (Element) i.next(); Map<String, Object> attrMap = new HashMap<>(); for (Iterator k = e.attributeIterator(); k.hasNext();) { Attribute attr = (Attribute) k.next(); attrMap.put(attr.getName(), attr.getValue()); } List<Object> content = new ArrayList<>(); if (!e.isTextOnly()) { for (Iterator l = e.elementIterator(); l.hasNext();) { Element innerEl = (Element) l.next(); Map<String, Object> innerAttrMap = new HashMap<>(); for (Iterator m = innerEl.attributeIterator(); m.hasNext();) { Attribute innerAttr = (Attribute) m.next(); innerAttrMap.put(innerAttr.getName(), innerAttr.getValue()); } content.add(innerAttrMap); } } else { content.add(e.getTextTrim()); } attrMap.put("content", content); list.add(attrMap); } map.put(el.getName(), list); } ``` 这段代码会将解析后的XML存储在一个Map<String, List<Map<String, Object>>>中,其中Map的key为节点名称,value为该节点下的所有子节点List<Map<String, Object>>。 希望这个回答能够帮助到你。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值