美文网首页
Java解析XML

Java解析XML

作者: Yinag | 来源:发表于2017-10-28 17:09 被阅读0次

    (一)XML解析技术
    解析:用java等技术将xml文件中有用的信息提取出来的过程。
    现常用的有两大类别:

    • DOM类别: 一次性将硬盘中的xml文件加载到内存中形成一颗倒状树,从根节点开始从上向下遍历,获取有用节点的内容。
    • SAX类别:分多次将硬盘中的xml文件加载到内存中,以事件的方式去解析节点中有用的内容。

    在这里我们选择XML解析器:dom4.j;dom4.j开发包叫:dom4.j-1.6.1.jar导入到你的工程的CLASSPATH路径下
    (二)DOM4.J简单介绍
    1、Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性
    2、Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j
    3、使用Dom4j开发,需下载dom4j相应的jar文件

    (三)DOM4J解析案例

    • 1、获得document的三种方式
      (1)读取
      (2)字符串转换
      (3)新建对象

    (1)读取


    
    
    package cn.itcast.andorid.copyOfDom4.j;
    
    import java.io.File;
    import java.io.FileOutputStream;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.io.XMLWriter;
    
    public class Demo01 {
        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            //将内存中的xml文件写入硬盘中去
            //创建一个内存中的document对象,表示硬盘中的xml文件
            Document xmlDocument =  DocumentHelper.createDocument();
            //将内存中的document文件写入硬盘中,形成一个xml文件
            XMLWriter xmlWriter = new XMLWriter(
                new FileOutputStream(new File("E:/new123.xml"))
            );
            xmlWriter.write(xmlDocument);
            xmlWriter.close();      
        }
    }
    
    

    结果:



    (2)字符串转换


    public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            //type01(); 
            //字符串转换
            String str = "<root><city>广州</city></root>";
            Document xmlDocument = DocumentHelper.parseText(str);
            XMLWriter xmlWriter = new XMLWriter(
                    new FileOutputStream(new File("E:/book1.xml"))
                );
                xmlWriter.write(xmlDocument);
                xmlWriter.close();
        }
    

    (3)新建对象


    public static void main(String[] args) throws Exception {       
       
            //新创建对象,dom4.j核心解析器
            SAXReader saxReader = new SAXReader();
            Document xmlDocument = saxReader.read(new File("E:/book.xml"));
            System.out.println(xmlDocument !=null?"已读到xml文件":"未读取到xml文件");
        }
    

    结果:

    • 2、获得根节点和其子节点
    package cn.itcast.andorid.copyOfDom4.j;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.List;
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class Demo02 {
    
        public static void main(String[] args) throws Exception {
            //创建dom4.j解析器
            SAXReader saxReader = new SAXReader();
            //创建InputStream对象,指向硬盘中的xml文件
            InputStream is = new FileInputStream(new File("E:/new.xml"));
            Document xmlDocument = saxReader.read(is);
            //获取根节点
            Element rootElement = xmlDocument.getRootElement();
            //输出根节点名字
            System.out.println(rootElement.getName());
            //获取根节点下面的直接子节点个数和名字
            List<Element> listElement = rootElement.elements("city");
            System.out.println(listElement.size());
            for(int i = 0;i<listElement.size();i++){
                System.out.println(listElement.get(i).getText());
            }
        }
    }
    
    
    • 3、遍历每个子节点属性和标签中的内容
    package cn.itcast.andorid.copyOfDom4.j;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class Demo03 {
    
        public static void main(String[] args) throws Exception {
            //遍历子节点的属性和内容
            //创建dom4.j解析器
            SAXReader saxReader = new SAXReader();
            /*Document xmlDocument  = saxReader.read(new File("E:/new.xml"));*/
            //创建InputStream对象,指向硬盘中的XML文件
            InputStream is = new  FileInputStream(new File("E:/book.xml"));
            //通过字节流对象,加载硬盘中的XML文件到内存中
            Document xmlDocument = saxReader.read(is);
            //获取根节点
            Element rootElement = xmlDocument.getRootElement();
            //显示根节点的名字
            System.out.println(rootElement.getName());
            //获取根节点下面的直接子节点个数和名字
            List<Element> elementList = rootElement.elements("book");
            //子节点个数
            System.out.println(elementList.size());
            /*System.out.println(elementList.size());*/
            for(Element element : elementList){
                //分别输出子节点title,price,author的内容
                String titleElement = element.element("title").getText().trim();
                System.out.println(titleElement);
                
                String priceElement = element.element("price").getText().trim();
                System.out.println(priceElement);
                
                String authorElement = element.element("author").getText().trim();
                System.out.println(authorElement);
                
                //子节点的id属性
                String id = element.attributeValue("id");
                System.out.println(id);
            }
                    
    
        }
    
    }
    
    

    (四)将Document对象写入XML文件
    • 文档中全为英文,不设置编码,直接写入的形式
    XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
    writer.write(document);
    writer.close();
    
    • 文档中含有中文,设置编码格式写入的形式
    package cn.itcast.andorid.copyOfDom4.j;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import org.dom4j.Document;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    
    public class Demo04 {
    
        public static void main(String[] args) throws Exception {
            //创建dom4.j解析器
            SAXReader saxReader = new SAXReader();
            //创建InputStream对象,指向硬盘中的xml文件
            InputStream is = new FileInputStream(new File("E:/book.xml"));
            Document xmlDocument = saxReader.read(is);  
            /*
             * 第一种方法
             * 
            //将DOUCMENT对象存放入硬盘中,形成xml文件
            XMLWriter writer = new XMLWriter(new FileWriter("e:/newbook.xml"));
            writer.write(xmlDocument);  
            writer.close();
            *
            */
            //第二种方法
            OutputFormat format = OutputFormat.createCompactFormat();
            OutputStream os = new FileOutputStream(new File("e:/newbook.xml"));
            XMLWriter  xmlWriter = new XMLWriter(os, format);
            xmlWriter.write(xmlDocument);
            xmlWriter.close();      
        }
    }
    
    

    (五)XPATH快速定位
    若一个xml文档里有着多层次标签的时候,想要定位到某个标签的内容时,使用dom4.j只能够依次寻找从上到下,比较繁琐。因此,使用XPATH
    1、XPATH是啥?

    XPATH是一门在xml文档中查找信息的语言,可用来对其中的元素和属性进行遍历,简化了dom4.j查找节点的过程

    2、XPATH语法


    3、查询节点
    (1)获取所有符合条件的节点:selectNode()返回一个List集合
    (2)获取符合条件的单个节点:selectSingleNode(xpath)返回一个Node元素,一般需要转换成Element类型,若有多个出现的话,只取其中一个。

    相关文章

      网友评论

          本文标题:Java解析XML

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