java jdom XML解析工具类

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.ArrayUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;

import java.io.IOException;
import java.io.StringReader;
import java.util.*;

/**
 * XML解析工具类
 */
public class XmlUtils {

    /**
     * 解析XML文本转为MAP。
     * 可以指定只解析ROOT元素下一级的某些元素的内容,如果不指定则解析所有ROOT元素下的内容。
     * @param xmlStr XML文本
     * @param flags  需要做解析的二级元素名称
     * @return
     */
    @SuppressWarnings("unchecked")
	public static Map<String,String> returnXMLData(String xmlStr,String...flags){
		Map<String,String> xmlData= new HashMap<String, String>();
        Element root = parseXML(xmlStr);
		
		if(root != null){
            if(flags == null || flags.length == 0) {
                xmlData = parseXMLNode(root);
            }else{
                List<Element> children = (List<Element>)root.getChildren();
                for (Element child : children) {
                    if(ArrayUtils.contains(flags, child.getName())){
                        xmlData.putAll(parseXMLNode(child));
                    }
                }
            }
		}
		return xmlData;
	}

    /**
     * 将XML文本转为XML元素对象
     * resXml:XML数据流
     * root:最终得到的根元素
     * */
    private static Element parseXML(String resXml){
        SAXBuilder sb=new SAXBuilder();  //初始化SAXBuilder
        //创建一个新的字符串
        StringReader read = new StringReader(resXml);
        //创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
        InputSource inSource = new InputSource(read);
        Document doc=null;  //定义一个Document文本对象
        Element root=null;  //定义一个Element根元素对象
        try {
            doc=sb.build(inSource);		//得到并构建XML文档对象
        } catch (JDOMException e1) {
            System.out.println("解析文本报错");
            e1.printStackTrace();
        } catch (IOException e1) {
            System.out.println("获取输入流报错");
            e1.printStackTrace();
        }

        if(doc!=null){
            root=doc.getRootElement();  //得到XML的根元素
        }else{
            System.out.println("解析root出错");
        }
        return root;
    }

    /**
     * 解析XML元素下的各节点,转为MAP
     * @param e XML元素
     * @return
     */
    @SuppressWarnings("rawtypes")
    private static Map<String,String> parseXMLNode(Element e) {
        Map<String, String> result = new HashMap<String, String>();
        Element child = null;   //定义一个Element元素对象

        //下面开始迭代循环
        for (Iterator childs = e.getChildren().iterator(); childs.hasNext(); ) {
            child = (Element) childs.next(); //获取节点下的每一个子元素
            result.put(child.getName(), child.getValue()); //将每一个元素的名称和值都保存到HashMap中,方便以后查询取出
        }
        return result;
    }



    /**
     * @param xmlStr
     * @param testNode
     * @param flags
     * @return
     */
    @SuppressWarnings("unchecked")
    public static Map<String,String> returnXMLDataMulti(String xmlStr,String multiNode,String...flags){
        Map<String,String> xmlData= new HashMap<String, String>();
        Element root = parseXML(xmlStr);

        if(root != null){
            if(flags == null || flags.length == 0) {
                xmlData = parseXMLNode(root);
            }else{
                List<Element> children = (List<Element>)root.getChildren();
                for (Element child : children) {
                    if(ArrayUtils.contains(flags, child.getName())){
                        xmlData.putAll(parseXMLNodeMulti(child, multiNode));
                    }
                }
            }
        }
        return xmlData;
    }

    /**
     * 处理多个相同的子节点,转换成json串
     * @param e
     * @param multiNode
     * @return
     */
    @SuppressWarnings("rawtypes")
    private static Map<String,String> parseXMLNodeMulti(Element e,String multiNode) {
        Map<String, String> result = new HashMap<String, String>();
        Element child = null;   //定义一个Element元素对象

        //下面开始迭代循环
        for (Iterator childs = e.getChildren().iterator(); childs.hasNext(); ) {
            child = (Element) childs.next(); //获取节点下的每一个子元素
            if(multiNode.equals(child.getName())){
                JSONArray jsonAll = new JSONArray();
                for(Iterator pciInfos = child.getChildren().iterator();pciInfos.hasNext();){//pciInfo节点
                    jsonAll.add(parseXMLNodeToString((Element) pciInfos.next()));
                }
                result.put(child.getName(),jsonAll.toString());
            }else{
                result.put(child.getName(), child.getValue()); //将每一个元素的名称和值都保存到HashMap中,方便以后查询取出
            }
        }
        return result;
    }

    /**
     * 处理节点内部子节点内容为json格式
     * @param e
     * @return
     */
    @SuppressWarnings("rawtypes")
    private static JSONObject parseXMLNodeToString(Element e) {
        JSONObject jsonObj = new JSONObject();
        Element child;   //定义一个Element元素对象
        //下面开始迭代循环
        for (Iterator childs = e.getChildren().iterator(); childs.hasNext(); ) {
            child = (Element) childs.next(); //获取节点下的每一个子元素
            //将每一个元素的名称和值都保存到json中,方便以后查询取出
            jsonObj.put(child.getName(),child.getValue());
        }
        return jsonObj;
    }


}




在这里插入图片描述

package com.hexiang.utils; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; /** * 本类是专门解析XML文件的,主要用于为系统读取自己的配置文件时提供最方便的解析操作 * @author HX * */ public class XmlManager { /** * 得到某节点下某个属性的值 * @param element 要获取属性的节点 * @param attributeName 要取值的属性名称 * @return 要获取的属性的值 * @author HX_2010-01-12 */ public static String getAttribute( Element element, String attributeName ) { return element.getAttribute( attributeName ); } /** * 获取指定节点下的文本 * @param element 要获取文本的节点 * @return 指定节点下的文本 * @author HX_2010-01-12 */ public static String getText( Element element ) { return element.getFirstChild().getNodeValue(); } /** * 解析某个xml文件,并在内存中创建DOM树 * @param xmlFile 要解析的XML文件 * @return 解析某个配置文件后的Document * @throws Exception xml文件不存在 */ public static Document parse( String xmlFile ) throws Exception { // 绑定XML文件,建造DOM树 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document domTree = db.parse( xmlFile ); return domTree; } /** * 获得某节点下的某个子节点(指定子节点名称,和某个属性的值) * 即获取parentElement下名字叫childName,并且属性attributeName的值为attributeValue的子结点 * @param parentElement 要获取子节点的那个父节点 * @param childName 要获取的子节点名称 * @param attributeName 要指定的属性名称 * @param attributeValue 要指定的属性的值 * @return 符合条件的子节点 * @throws Exception 子结点不存在或有多个符合条件的子节点 * @author HX_2008-12-01 */ public static Element getChildElement( Element parentElement, String childName, String attributeName, String attributeValue ) throws Exception { NodeList list = parentElement.getElementsByTagName( childName ); int count = 0; Element curElement = null; for ( int i = 0 ; i < list.getLength() ; i ++ ) { Element child = ( Element )list.item( i ); String value = child.getAttribute( attributeName ); if ( true == value.equals( attributeValue ) ) { curElement =
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值