xml操作

1.Dom4j

package Read;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;

/** 
 * @author: 07
 * @date: 2017年9月8日 上午10:35:42 
 * @version 1.0
 * @parameter 使用dom4j操作,先使用io流读取所有的数据到字符串中,再使用dom4j.jar
 *                   进行解析。(可以加上日志打印)、适合配置文件下面都是符合key-Value的形式。优点:性能最好。
 * @return  hashmap key-value
 */
public class XmlUtilDom4j {
    /** 配置项的key,value映射map */
    private static HashMap<String, String> configs = null;
    /** 默认的配置文件 */
    public final static String DEFAULT_FILE = "/config.xml";
    
    static{
        // 加载默认的配置文件
        load(DEFAULT_FILE);
        insertXml(DEFAULT_FILE);
    }
    public static void load(String fileName){
        StringBuffer xml=new StringBuffer();
        InputStream is = XmlUtilDom4j.class.getResourceAsStream(fileName);
        BufferedReader reader = null;
        String line=null;
        try {
             reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
             while((line=reader.readLine())!=null){
                 xml.append(line);
             }
             // 保证在任何时候调用load方法时都能完重新加载配置
             configs = new HashMap<String, String>();
             //获取文档
             Document doc = DocumentHelper.parseText(xml.toString());
             Element root=doc.getRootElement();
             List<Element> lists = root.elements();
             for(Element element:lists){
                 /** <config key="rate_port">9988</config> */
                 String key=element.attributeValue("key");//获取标签里面key属性值
                 String value=element.attributeValue("value");//获取标签里面value的属性值
                 String text = element.getText();//获得节点值
                // 检查key是否重复,重复的就忽略,以免影响之前的配置
                 if(configs.containsKey(key)){
                     continue;
                 }
                 if(value != null && value.length()>0){
                     configs.put(key, value);
                 }else{
                     configs.put(key, text);
                 }
             }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭资源。
                reader.close();
                is.close();
            } catch (IOException e) {
            }
        }
    }
    
    public static void insertXml(String fileName){
        StringBuffer xml=new StringBuffer();
        InputStream is = XmlUtilDom4j.class.getResourceAsStream(fileName);
        BufferedReader reader = null;
        String line=null;
        try {
             reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
             while((line=reader.readLine())!=null){
                 xml.append(line);
             }
             Document doc = DocumentHelper.parseText(xml.toString());
             Element root=doc.getRootElement();
             //创建标签元素并设置值
             Element myconfig = DocumentHelper.createElement("config");
             myconfig.addAttribute("key", "myconfig");
             myconfig.addText("这是我的config");
             root.add(myconfig);
             
             OutputStream os=new FileOutputStream("D:\\JavaLearning\\XML\\source\\config.xml");
             XMLWriter writer=new XMLWriter(os);
             writer.write(doc);
             writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭资源。
                reader.close();
                is.close();
            } catch (IOException e) {
            }
        }
        
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    /**
     * 取得配置值
     * @param key
     * @return
     */
    public static String get(String key){
        return configs.get(key);
    }
    
    public static Integer getInteger(String key){
        return Integer.valueOf(get(key));
    }
    
    public static Double getDouble(String key){
        return Double.valueOf(get(key));
    }
    
    public static boolean getBoolean(String key){
        return Boolean.valueOf(get(key));
    }
    
    
    public static void main(String[] args) {
        String str="   ";//字符串空格也算长度
        System.out.println(configs.toString());
    }

}

2.dom4j读取xml文件获得文档的方式

package Read;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/** 
 * @author: 07
 * @date: 2017年9月8日 上午10:35:42 
 * @version 1.0
 * @parameter 使用dom4j操作,先使用io流读取所有的数据到字符串中,再使用dom4j.jar
 *                   进行解析。(可以加上日志打印)、适合配置文件下面都是符合key-Value的形式
 * @return  hashmap key-value
 */
public class XmlUtilDom4j2 {
    /** 配置项的key,value映射map */
    private static HashMap<String, String> configs = null;
    /** 默认的配置文件 */
    public final static String DEFAULT_FILE = "D:\\JavaLearning\\XML\\source\\config.xml";
    
    static{
        // 加载默认的配置文件
        load(DEFAULT_FILE);
    }
    public static void load(String fileName){
        File file=new File(DEFAULT_FILE); //读绝对路径的内容!
        SAXReader reader=new SAXReader();
        try {
            Document doc = reader.read(file);
            Element root = doc.getRootElement();
            List<Element> list = root.elements();
            //赋予空间
            configs=new HashMap<>();
            for(Element e:list){
                String text = e.getText();
                String key = e.attributeValue("key");
                String value = e.attributeValue("value");
                //重复的去掉,留着之前的值
                if(configs.containsKey(key)){
                    continue;
                }
                //看下value是否为空
                if(value!=null&&value.length()>0){
                    configs.put(key, value);
                }else {
                    configs.put(key, text);
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 取得配置值
     * @param key
     * @return
     */
    public static String get(String key){
        return configs.get(key);
    }
    
    public static Integer getInteger(String key){
        return Integer.valueOf(get(key));
    }
    
    public static Double getDouble(String key){
        return Double.valueOf(get(key));
    }
    
    public static boolean getBoolean(String key){
        return Boolean.valueOf(get(key));
    }
    
    public static void main(String[] args) {
        String str="   ";//字符串空格也算长度
//        System.out.println(str.isEmpty()); //判断不了除非str.trim().isEmpty()
        System.out.println(configs.toString());
    }

}

xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 没有约束的xml文件 -->
<configs>

      <!-- 计费接口 -->
      <config key="rate_host">192.168.1.251</config>    
      <config key="rate_port">9988</config>
      <!-- end -->    
      
      <!-- 提现是否要审核 -->
      <config key="enable_check">false</config>
     
    <!--END -->
</configs>

3.dom

package Read;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Vector;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

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


/** 
 * @author: 07
 * @date: 2017年9月8日 下午1:49:56 
 * @version 1.0
 * @parameter test
 * @return  xml.jar
 */
public class XmlUtilDom {
    /** 配置项的key,value映射map */
    private static HashMap<String, String> configs = null;
    private static ArrayList<Object> array=new ArrayList<>();
    /** 默认的配置文件 */
    public final static String DEFAULT_FILE = "Student.xml";
    
    static{
        // 加载默认的配置文件
//        load(DEFAULT_FILE);
    }
    public static void load(String fileName){
        //实例化工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=null;
        try {
            InputStream is=XmlUtilDom.class.getClassLoader().getResourceAsStream(DEFAULT_FILE);
            //构建解析器
            builder = builderFactory.newDocumentBuilder();
            Document doc = builder.parse(is);
//            Element element = doc.getDocumentElement();//获得根元素element.getTagName().toString()
            NodeList list = doc.getElementsByTagName("student");//根据节点名获取节点集合
            configs=new HashMap<>();
            for(int i=0;i<list.getLength();i++){
                Element ele = (Element)list.item(i);
                Hashtable<String, String> map=new Hashtable<>();
                String name=ele.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
                String sex=ele.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue();
                String age=ele.getElementsByTagName("age").item(0).getFirstChild().getNodeValue();
                map.put("name", name);
                map.put("sex", sex);
                map.put("age", age);
                array.add(map);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //加多一个student
    public static void insertXml(){
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            InputStream is=XmlUtilDom.class.getResourceAsStream("/Student.xml");
//            Document doc = builder.newDocument(); //创建新的
            Document doc = builder.parse(is);    //在原有的基础上增加
            
//            Element element = doc.createElement("root");//获得根节点
            Element element = doc.getDocumentElement();
            Element student = doc.createElement("student");
            Element name = doc.createElement("name");
            Element sex = doc.createElement("sex");
            Element age = doc.createElement("age");
            
            student.setAttribute("id","6");
            student.setAttribute("group", "6");
            
            name.setTextContent("test");
            sex.setTextContent("女");
            age.setTextContent("123");
            
            student.appendChild(name);
            student.appendChild(sex);
            student.appendChild(age);
            element.appendChild(student);
//            doc.appendChild(element); 
            /** 写入 */
            OutputStream os=new FileOutputStream("D:\\JavaLearning\\XML\\source\\Student1.xml");
            TransformerFactory ttf=TransformerFactory.newInstance();
            Transformer transformer = ttf.newTransformer();
            // 设置输出数据时换行
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.transform(new DOMSource(doc), new StreamResult(os));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
//        load(DEFAULT_FILE);
        insertXml();
    }

}

xml文件

<?xml version="1.0" encoding="utf-8"?>
<root>
    <student id="1" group="1">
        <name>张三</name>
        <sex></sex>
        <age>18</age>
    </student>
    <student id="2" group="2">
        <name>李四</name>
        <sex></sex>
        <age>18</age>
    </student>
    <student id="3" group="3">
        <name>小王</name>
        <sex></sex>
        <age>18</age>
    </student>
    <student id="4" group="4">
        <name>小张</name>
        <sex></sex>
        <age>18</age>
    </student>
    <student id="5" group="5">
        <name>小明</name>
        <sex></sex>
        <age>18</age>
    </student>
</root>

4.sax

package Read;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

/**
 * @author: 07
 * @date: 2017年9月8日 下午5:03:22
 * @version 1.0
 * @parameter test
 * @return SAX,全称Simple API for
 *         XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。
 *         由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。但是无法知道当前解析标签(节点)
 *         的上层标签,及其嵌套结构,仅仅知道当前解析的标签的名字和属性,要知道其他信息需要程序猿自己编码 只能读取XML,无法修改XML
 *         无法随机访问某个标签(节点)
 */
public class Sax {
    public static void load(String fileName) {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = null;
        try {
            InputStream is=new FileInputStream("D:/JavaLearning/XML/source/Teacher.xml");
            parser = factory.newSAXParser();
            MySAXParserHandle handler = new MySAXParserHandle();
            parser.parse(is, handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        load("");
//        ArrayList<String> list = MySAXParserHandle.array;
//        Iterator<String> it=list.iterator();
//        while(it.hasNext()){
//            System.err.println(it.next().toString());
//        }
    }

}

MySAXParserHandle

package Read;

import java.util.ArrayList;
import java.util.HashMap;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/** 
 * @author: 07
 * @date: 2017年9月8日 下午5:25:00 
 * @version 1.0
 * @parameter test
 * @return  
 */
public  class MySAXParserHandle extends DefaultHandler {
    private String str="";
    private StringBuffer result=new StringBuffer();//用来连接标签值
    private String result1="";
    int i=0;
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if(!"test".equals(qName)){//去掉最外的标签
            int i=attributes.getLength();//有多少个属性
            str="<"+qName; 
            for(int j=0;j<i;j++){
                str+=" "+attributes.getQName(j)+"=\""+attributes.getValue(j)+"\"";
            }
            str+=">"+"#"+"</"+qName+">";
        }
        super.startElement(uri, localName, qName, attributes); //qName=标签名,
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
//        String replaceAll = str.replaceAll("#", result1);
//        result1="";
//        str="";
    }
    /**
     * SAX解析器可以返回单个块中的所有连续字符数据,也可以将其分割成几个块。(我们看到会执行两次,把结果在读取标签结束时连起来就可以了,或者为空不要也行[一般第一个就是了,第二个基本都是空])
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        String nodeValue = new String(ch, start, length);
//        if(!nodeValue.trim().equals("")){
//            result1=nodeValue;
//        }
        //*********************************************************************
        result.append(nodeValue);
        if(i==1){
            String replaceAll = str.replaceAll("#", result.toString());
            System.out.println(replaceAll);
            result.setLength(0);
            str="";
            i=0;
        }
        i++;
    }
    

}

读取的xml

<?xml version="1.0" encoding="UTF-8"?>
<test>
    <gg key="dd">dd</gg>
    <vic key="22" value="22">sss</vic>
    <ss key="my">看到手机</ss>
</test>

5.XmlPull用的也是很多的。

package Read;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import entity.Student;

/** 
 * @author: 07
 * @date: 2017年9月11日 下午2:05:04 
 * @version 1.0
 * @parameter test
 * @return  导入xmlpull.jar.pull和sax很相似,区别在于:pull读取xml文件后触发相应的事件调用方法返回的是数字,且pull可以在程序中控制,想解析到哪里就可以停止解析。
 */
public class pullXmlUtil {
    public List<Student> load(){
        //定义容器
            List<Student> list = null;
            Student student = null;
        try {
            //new一个xmlPull工厂
            XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
            //使用工厂类生成操作对象
            XmlPullParser pullParser = factory.newPullParser();
            //构建一个输入流
            InputStream is = this.getClass().getClassLoader().getResourceAsStream("Student.xml");
            //关联操作对象和流
            pullParser.setInput(is, "UTF-8");
            
            int eventType = pullParser.getEventType();//触发的事件
            while(eventType != XmlPullParser.END_DOCUMENT){
                String nodeName=pullParser.getName();//读取的值
                switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    System.out.println("开始读取文档");
                    break;
                case XmlPullParser.START_TAG:
                    if("root".equals(nodeName)){
                        list = new ArrayList<Student>();
                    }else if("student".equals(nodeName)){
                        student = new Student();
                        student.setId(Integer.parseInt(pullParser.getAttributeValue(0)));
                        student.setGroup(pullParser.getAttributeValue(1));
                    }else if("name".equals(nodeName)){ //注意此处的nextText调用一次就下一个了,如有打印,日志等操作也会有影响,要先声明变量存储。
                        student.setName(pullParser.nextText());
                    }else if("age".equals(nodeName)){
                        student.setAge(Integer.parseInt(pullParser.nextText()));
                    }else if("sex".equals(nodeName)){
                        student.setSex(pullParser.nextText());
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if("student".equals(nodeName)){
                        list.add(student);
                    }
                    break;
                default:
                    break;
                }
                // 手动的触发下一个事件
                eventType = pullParser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
        
    }
    public static void main(String[] args) {
        pullXmlUtil pullXmlUtil=new pullXmlUtil();
        List<Student> list = pullXmlUtil.load();
        for(Student s:list){
            System.out.println(s.toString());
        }
    }

}

xml:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <student id="1" group="1">
        <name>张三</name>
        <sex></sex>
        <age>18</age>
    </student>
    <student id="2" group="2">
        <name>李四</name>
        <sex></sex>
        <age>18</age>
    </student>
</root>
posted @ 2017-09-11 15:35  永恒之蓝  阅读(179)  评论(0编辑  收藏  举报