zoukankan      html  css  js  c++  java
  • java攻城狮之路--复习xml&dom_pull编程续

    本章节我们要学习XML三种解析方式:

    1、JAXP DOM 解析
    2、JAXP SAX 解析
    3、XML PULL 进行 STAX 解析

    XML 技术主要企业应用
    1、存储和传输数据
    2、作为框架的配置文件

    使用xml 存储和传输数据
    1、通过程序生成xml
    2、读取xml 中数据 ---- xml 解析

    什么是DOM和SAX ?
    DOM Document Object Model ----- 文档对象模型
    DOM思想: 将整个xml 加载内存中,形成文档对象,所有对xml操作都对内存中文档对象进行
    DOM 是官方xml解析标准
    * 所有开发语言都支持的

    Java、JavaScript 都支持DOM

    SAX Simple API for XML ----- XML 简单 API
    程序员为什么发明sax解析方式?? 当xml 文档非常大,不可能将xml所有数据加载到内存
    SAX 思想:一边解析 ,一边处理,一边释放内存资源 ---- 不允许在内存中保留大规模xml 数据

    StAX The Stream API for XML ----- XML 流 API
    STAX 是一种 拉模式 xml 解析方式,SAX 是一种 推模式 XML 解析方式

    推push模式:由服务器为主导,向客户端主动发送数据
    拉pull模式: 由客户端为主导,主动向服务器申请数据

    程序员在实际开发中,使用已经开发好工具包 ----- JAXP 、DOM4j 、XML PULL

    解析方式 与 解析开发包 关系?
    解析方式是解析xml 思想,没有具体代码,解析开发包是解析xml思想具体代码实现

    JAXP 是sun官方推出实现技术 同时支持 DOM SAX STAX
    DOM4j 是开源社区开源框架 支持 DOM 解析方式
    XML PULL Android 移动设备内置xml 解析技术 支持 STAX 解析方式

    当SAX和STAX 读取xml数据时,如果读取到内存数据不释放 ----- 内存中将存在整个xml文档数据
    (类似DOM 支持修改和回写)。

    DOM、SAX、STAX 在实际开发中选择?
    在javaee日常开发中 ---- 优先使用DOM (编程简单)
    当xml 文档数据非常多,不可能使用DOM ---造成内存溢出 ------ 优先使用STAX
    移动开发 使用 STAX ---- Android XML PULL

    JAXP 开发 进行 xml解析 :
    javax.xml.parsers 存放 DOM 和 SAX 解析器
    javax.xml.stream 存放 STAX 解析相关类
    org.w3c.dom 存放DOM解析时 数据节点类
    org.xml.sax 存放SAX解析相关工具类

    DOM 解析快速入门
    1、创建 xml 文档 books.xml
    在企业实际开发中,为了简化xml 生成和解析 ---- xml 数据文件通常不使用约束的
    2、使用DOM解析xml
    将整个xml文档加载到内存中 : 工厂 --- 解析器 --- 解析加载
    3、Document通过 getElementsByTagName 获得 节点集合 NodeList
    通过 NodeList 提供 getLength 和 item 遍历 节点集合

    遍历ArrayList
    for (int i=0;i<arraylist.size();i++){
    arraylist.get(i);
    }

    遍历NodeList
    for (int i=0;i<nodelist.getLength();i++){
    nodelist.item(i); ----- 将遍历每个节点转换子接口类型
    }

    什么是 Node? 对于xml 来说,xml所有数据都是node节点包括:
    (元素节点、属性节点、文本节点、注释节点、CDATA节点、文档节点)。

    Element Attr Text Comment CDATASection Document ----- 都是 Node 子接口

    node有三个通用API :
    getNodeName():返回节点的名称
    getNodeType():返回节点的类型
    getNodeValue():返回节点的值 ---- 所有元素节点value都是 null

    ------------------------------------------------------------------------------------
    DOM 编程思路小结
    1、装载XML文档 ---- Document
    2、Document 获得指定元素 ----- getElementsByTagName (返回 NodeList)
    3、遍历NodeList 获得 每个 Node
    4、将每个Node 强制转换 Element
    5、通过元素节点API 操作属性和文本内容
    getAttribute 获得属性值
    getTextContent 获得元素内部文本内容

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
        <book>
            <name>java编程思想</name>
            <price>88</price>
        </book>
        <book>
            <name>java编程高手</name>
            <price>99</price>
        </book>
    </books>
    books2.xml
    package com.shellway.javase;
    
    import java.io.IOException;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import org.junit.Test;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    public class demo1 {
          @Test
          public void getElement() throws ParserConfigurationException, SAXException, IOException{
              DocumentBuilderFactory douBuilderFactory = DocumentBuilderFactory.newInstance();
              DocumentBuilder documentBuilder =  douBuilderFactory.newDocumentBuilder();
              Document document = documentBuilder.parse("xml/books2.xml");
              //通过父节点获得相应书籍《java编程思想》图书的价格
              NodeList nodeList = document.getElementsByTagName("book");
              for (int i = 0; i < nodeList.getLength(); i++) {
                Element element = (Element) nodeList.item(i);
                Element element1 = (Element) element.getChildNodes().item(1);
                if (element1.getTextContent().equals("java编程思想")) {
                    System.out.println(element.getChildNodes().item(3).getTextContent());
                }
            }
          }
          
          @Test
          public void getElement2() throws ParserConfigurationException, SAXException, IOException{
               DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
               DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
               Document document = documentBuilder.parse("xml/books2.xml");
               //通过兄弟节点获得相应书籍《java编程高手》的价格
               NodeList nodeList = document.getElementsByTagName("name");
               for (int i = 0; i < nodeList.getLength(); i++) {
                  Element element = (Element) nodeList.item(i);
                  if (element.getTextContent().equals("java编程高手")) {
                           String str =  element.getNextSibling().getNextSibling().getTextContent();
                           System.out.println(str);
                }
            }
         }
    }
    获得相应书籍《java编程高手》的价格

    通过id来找到对应的元素节点,是通过id的值。前提还必须要求本此元素节点所在的xml文档有约束。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE books [
       <!ELEMENT books (book+) >
       <!ELEMENT book (name,price)>
       <!ELEMENT name (#PCDATA)>
       <!ELEMENT price (#PCDATA)>
       <!ATTLIST name
              id ID #REQUIRED>
    ]> 
    
    <books>
        <book>
            <name id="b001">java编程思想</name>
            <price>88</price>
        </book>
        <book>
            <name id ="b002">java编程高手</name>
            <price>99</price>
        </book>
    </books>
    具有内部DTD约束条件的xml文档:books2.xml
        @Test
        public void getElement3() throws Exception {
            //通过id借助它的值找到对应的元素节点
            DocumentBuilderFactory documentBuilderFactory = 
                                                  DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            Document document = documentBuilder.parse("xml/books2.xml");
    
            Element element = document.getElementById("b001");
            System.out.println(element.getTextContent());
            System.out.println(element.getNextSibling().getNextSibling().getTextContent());
        }
    通过id借助它的值找到对应的元素节点测试函数

    先用全局查找锁定范围,再用相对关系查找 得到需要数据

    getElementById 方法 必须用于带有约束 xml文档中 !!!!!!!

    所以开发语言默认支持DTD,当使用Schema时,单独编程导入schema !

    XML DOM 增加 、修改 和 删除操作 ------ 操作 内存中文档对象

    XML的回写

    XML元素添加 : 1、创建节点元素 2、将节点元素加入指定位置

    XML元素修改 : 查询到指定元素 1、修改属性 setAttribute
                                              2、修改元素文本内容 setTextContent

    XML元素删除 :删除节点.getParentNode().removeChild(删除节点)

    <?xml version="1.0" encoding="UTF-8" standalone="no"?><books>
        <book>
            <name id="b001">java编程思想</name>
            <price>88</price>
        </book>
        <book>
            <name id="b002">java编程高手</name>
            <price>100</price>
        </book>
            <book>
            <name id="b002">编程高手秘笈</name>
            <price>120.0</price>
        </book>
    </books>
    books2.xml
    package com.shellway.javase;
    
    import java.io.File;
    import java.io.IOException;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.junit.Test;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    public class demo2 {
         @Test
        public void testAddForDom() throws Exception{
             //加载XML文档到内存中:创建工厂---加载器---加载文档
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            Document document = documentBuilder.parse("xml/books2.xml");
            
            //获得根节点
            Element root =  document.getDocumentElement();
            //创建一个新节点
            Element user = document.createElement("user");
            root.appendChild(user);
            //设置name的内容,并且添加为元素user的子节点
            Element name = document.createElement("name");
            name.setTextContent("张三");
            user.appendChild(name);
            //为name添加一个属性
            name.setAttribute("id", "b003");
            
            //回写内容到XML中
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource domSourse = new DOMSource(document);
            StreamResult stream = new StreamResult("xml/books2_bak.xml");
            transformer.transform(domSourse,stream );
        }
         
         @Test
         public void testUpdateForDom() throws Exception{
             DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
             DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
             Document document = documentBuilder.parse("xml/books2.xml");
             
             NodeList nodeList = document.getElementsByTagName("name");
             for (int i = 0; i < nodeList.getLength(); i++) {
                Element name = (Element) nodeList.item(i);
                if (name.getTextContent().equals("java编程高手")) {
                    Element priceN = (Element) name.getNextSibling().getNextSibling();
                    Double price = Double.parseDouble(priceN.getTextContent());
                    price = price * 1.2;
                    priceN.setTextContent(price+"");
                }
            }
             
             //回写到xml
             TransformerFactory transformerFactory = TransformerFactory.newInstance();
             Transformer transformer = transformerFactory.newTransformer();
             
             DOMSource domSource = new DOMSource(document);
             StreamResult streamResult = new StreamResult(new File("xml/books2.xml"));
             transformer.transform(domSource, streamResult);
         }
         
         @Test
         public void testDeleteForDom() throws Exception{
             
             DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
             DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
             Document document = documentBuilder.parse("xml/books2.xml");
             
             NodeList nodeList = document.getElementsByTagName("name");
             for (int i = 0; i < nodeList.getLength(); i++) {
                Element name = (Element) nodeList.item(i);
                //删除包含有java的书籍
                if (name.getTextContent().contains("java")) {
                    //得到此节点的父节点,因为删除必须通过父节点才能删除自己
                    Element element = (Element) name.getParentNode();
                    element.getParentNode().removeChild(element);
                    //注意:当删除第一个节点后,第二个节点会变成第一个节点,所以要i--
                    i--;
                }
            }
             //回写到xml
             TransformerFactory transformerFactory = TransformerFactory.newInstance();
             Transformer transformer = transformerFactory.newTransformer();
             
             DOMSource domSource = new DOMSource(document);
             StreamResult streamResult = new StreamResult(new File("xml/books2.xml"));
             transformer.transform(domSource, streamResult); 
         }
    }
    xml的增、删、改

    --------------------------------------------------------------------------
    SAX 和 STAX 都是 基于事件驱动 ----- SAX推模式 STAX拉模式
    SAX常用事件
    startDocument() ---- 文档开始事件
    startElemen() ---- 元素开始事件
    characters() ---- 文本元素事件
    endElement() ---- 元素结束事件
    endDocument() ----- 文档结束事件

    为什么说SAX是推模式解析? 解析器控制xml文件解析,由解析器调用相应事件方法

    在startElemen() endElement() 获得开始和结束元素名称
    在characters() 获得读取到文本内容
    在startElemen() 读取属性值

    JAXP SAX的原理和使用练习:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <books>
        <book>
            <name id="b001">java编程思想</name>
            <price>88</price>
        </book>
        <book>
            <name id="b002">java编程高手</name>
            <price>100</price>
        </book>
            <book>
            <name id="b003">编程高手秘笈</name>
            <price>120.0</price>
        </book>
    </books>
    books2.xml
    package com.shellway.javase;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.junit.Test;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class demo3 {
         @Test
         public void testSax() throws Exception{
             SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
             SAXParser saxParser = saxParserFactory.newSAXParser();
             
             myHandler handler = new myHandler();
             saxParser.parse("xml/books2.xml",handler);
         }
    }
    
    class myHandler extends DefaultHandler {
        @Override
        public void startDocument() throws SAXException {
          System.out.println("startDocument...");
        }
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
              System.out.println("startElement:"+qName);
              if (qName.equals("name")) {
                String str =  attributes.getValue("id");
                System.out.println(str+"-------");
            }
        }
        @Override
        public void characters(char[] ch, int start, int length){
            String str = new String(ch,start,length);
            System.out.println("characters:"+str);
        }
        @Override
        public void endElement(String uri, String localName, String qName){
            System.out.println("endElement:"+qName);
        }
        @Override
        public void endDocument() throws SAXException {
            System.out.println("endDocument...");
        }
    }
    jaxp sax的使用例子

    STAX 拉模式xml 解析方式 ----- 客户端程序,自己控制xml事件,主动调用相应事件方法

    当使用XML PULL 如果使用Android系统,系统内置无需下载任何开发包,如果想JavaSE JavaEE
    使用pull 解析技术 下载单独pull 开发工具包。

    xpp3 ----- XML Pull Parser 3 是pull API 代码实现

    使用pull 解析器
    1、去网站上 下载 pull 解析器实现 xpp3 (Android 内置)
    2、将 xpp3-1.1.3.4.C.jar 导入 java工程
    导入jar包 位于 当前工程内部 , 在工程内新建 lib ,将jar复制过来 , 将pull 解析器 jar 添加build path

    jar 包就是.class文件 集合压缩包 (采用zip格式压缩)

    Pull解析器 使用 stax 解析方式 ---- 拉模式解析
    Pull采用将xml文档传递 解析器,手动通过next触发文档解析事件,在客户端代码中获取当前事件 ,从而调用相应事件处理方法

    3、创建pull 解析器
    4、将xml 文档内容传递 pull 解析器

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <books>
        <book>
            <name id="b001">java编程思想</name>
            <price>88</price>
        </book>
        <book>
            <name id="b002">java编程高手</name>
            <price>100</price>
        </book>
            <book>
            <name id="b003">编程高手秘笈</name>
            <price>120.0</price>
        </book>
    </books>
    books2.xml
    import java.io.FileInputStream;
    
    import org.junit.Test;
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    import org.xmlpull.v1.XmlPullParserFactory;
    
    public class demo4 {
        
        @Test
        public void testPull2() throws Exception{
            XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
            xmlPullParser.setInput(new FileInputStream("xml/books2.xml"), "utf-8");
            
            int event;
            boolean flag = false;
            while((event = xmlPullParser.getEventType())!=XmlPullParser.END_DOCUMENT){
                if(event==XmlPullParser.START_TAG&&xmlPullParser.getName().equals("name")){
                    String name = xmlPullParser.nextText();
                    if(name.equals("java编程高手")){
                        flag = true;
                //        xmlPullParser.next();
                //        xmlPullParser.next();
                //        System.out.println(xmlPullParser.nextText());
                    }
                }
                if(event == xmlPullParser.START_TAG&&xmlPullParser.getName().equals("price")&&flag){
                    System.out.println(xmlPullParser.nextText());
                    //flag = false;或者推出循环
                    break;
                }
                xmlPullParser.next();
            }
        }
        
        @Test
        public void testPull() throws Exception{
         XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
         XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
         xmlPullParser.setInput(new FileInputStream("xml/books2.xml"), "utf-8");
         
         int event;
         while((event = xmlPullParser.getEventType())!=XmlPullParser.END_DOCUMENT){
        //     if(event == XmlPullParser.START_TAG){
                 System.out.println(xmlPullParser.getEventType());
        //     }
             //处理下一个事件
             event = xmlPullParser.next();
         }
      }
    }
    STAX的快速入门

    为什么 STAX 解析方式 效率 好于 SAX ?
    1、SAX 无选择性的,所有事件都会处理 解析方式,Stax 由用户控制需要处理事件类型
    2、在使用Stax进行数据解析时,随时终止解析

    Pull 解析器 生成 xml 文档功能 ---- 通过 XmlSerializer 生成 xml 文档
    解析xml : 文档开始、元素开始、文本元素、元素结束、文档结束
    生成xml :生成文档声明(文档开始),元素开始、文本内容、元素结束 、文档结束
    1、生成简单xml
    2、通过对象数据生成xml
    3、通过对象List数据生成xml

    在程序中抽取两个方法 ----- 1. xml --- List对象 2. List对象生成xml

      1 package com.shellway.javase;
      2 
      3 import java.io.FileOutputStream;
      4 import java.util.ArrayList;
      5 import java.util.List;
      6 import org.junit.Test;
      7 import org.xmlpull.v1.XmlPullParserFactory;
      8 import org.xmlpull.v1.XmlSerializer;
      9 import com.shellway.domain.Company;
     10 
     11 public class demo4 {
     12     /**
     13      * 按照多个对象生成XML文档
     14      * @throws Exception
     15      */
     16     @Test
     17     public void demo3() throws Exception{
     18         List<Company> companies = new ArrayList<Company>();
     19         Company company = new Company();
     20         company.setName("shellway");
     21         company.setPnum(200);
     22         company.setAddress("深圳西丽");
     23         Company company2 = new Company();
     24         company2.setName("Jerry");
     25         company2.setPnum(500);
     26         company2.setAddress("深圳西丽");
     27         companies.add(company);
     28         companies.add(company2);
     29         
     30         XmlSerializer xmlSerializer = XmlPullParserFactory.newInstance().newSerializer();
     31         xmlSerializer.setOutput(new FileOutputStream("xml/company.xml"), "utf-8");
     32         xmlSerializer.startDocument("utf-8", true);
     33         
     34         xmlSerializer.startTag(null, "companies");
     35         
     36         for (Company c : companies) {
     37             xmlSerializer.startTag(null, "company");
     38             
     39             xmlSerializer.startTag(null, "name");
     40             xmlSerializer.text(c.getName());
     41             xmlSerializer.endTag(null, "name");
     42             
     43             xmlSerializer.startTag(null, "pnum");
     44             xmlSerializer.text(c.getPnum()+"");
     45             xmlSerializer.endTag(null, "pnum");
     46             
     47             xmlSerializer.startTag(null, "address");
     48             xmlSerializer.text(c.getAddress());
     49             xmlSerializer.endTag(null, "address");
     50             
     51             xmlSerializer.endTag(null, "company");
     52         }
     53         xmlSerializer.endTag(null, "companies");
     54         xmlSerializer.endDocument();
     55     }
     56     
     57     /**
     58      * 按照一个对象生成XML文档
     59      * @throws Exception
     60      */    
     61     @Test
     62     public void demo2() throws Exception{
     63         Company company = new Company();
     64         company.setName("shellway");
     65         company.setPnum(200);
     66         company.setAddress("深圳西丽");
     67         
     68         XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
     69         XmlSerializer xmlSerializer = xmlPullParserFactory.newSerializer();
     70         
     71         xmlSerializer.setOutput(new FileOutputStream("xml/company.xml"), "utf-8");
     72         xmlSerializer.startDocument("utf-8", true);
     73         
     74         xmlSerializer.startTag(null, "company");
     75         
     76         xmlSerializer.startTag(null, "name");
     77         xmlSerializer.text(company.getName());
     78         xmlSerializer.endTag(null, "name");
     79         
     80         xmlSerializer.startTag(null, "pnum");
     81         xmlSerializer.text(company.getPnum()+"");
     82         xmlSerializer.endTag(null, "pnum");
     83         
     84         xmlSerializer.startTag(null, "address");
     85         xmlSerializer.text(company.getAddress());
     86         xmlSerializer.endTag(null, "address");
     87         
     88         xmlSerializer.endTag(null, "company");
     89         xmlSerializer.endDocument();
     90     }
     91     
     92     /**
     93      * 生成简单的XML文档
     94      * @throws Exception
     95      */
     96     @Test
     97     public void testXmlSerializer() throws Exception{
     98         XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
     99         XmlSerializer xmlSerializer = xmlPullParserFactory.newSerializer();
    100         
    101         //设置序列化输出文档
    102         //第二个参数是保存的编码
    103         xmlSerializer.setOutput(new FileOutputStream("xml/company.xml"), "utf-8");
    104         //开始文档
    105         //第二个参数为查看的编码,第二个参数为文档是否是alone
    106         xmlSerializer.startDocument("utf-8", true);
    107         //开始元素
    108         xmlSerializer.startTag(null, "name");//第一个参数为名称空间,若没有则  ""或者null
    109         //文本内容
    110         xmlSerializer.text("我们的公司");
    111         //结束元素
    112         xmlSerializer.endTag(null, "name");
    113         //结束文档
    114         xmlSerializer.endDocument();
    115     }
    116 }
    按照对象生成xml文档

    对内存中List进行CURD操作

     1     @Test
     2     public void demo5() throws Exception{
     3         List<Company> list = new ArrayList<Company>();
     4         Company company = null;
     5         XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
     6         XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
     7         
     8         xmlPullParser.setInput(new FileInputStream("xml/company.xml"), "utf-8");
     9         int event;
    10         while((event=xmlPullParser.getEventType())!=XmlPullParser.END_DOCUMENT){
    11             
    12             if(event==XmlPullParser.START_TAG&&xmlPullParser.getName().equals("name")){
    13                 company = new Company();//注意这句不能放在外面,因为有空文本,结果将是空对象
    14                 company.setName(xmlPullParser.nextText());
    15             }
    16             if(event==XmlPullParser.START_TAG&&xmlPullParser.getName().equals("pnum")){
    17                 company.setPnum(Integer.parseInt(xmlPullParser.nextText()));
    18             }
    19             if(event==XmlPullParser.START_TAG&&xmlPullParser.getName().equals("address")){
    20                 company.setAddress(xmlPullParser.nextText());
    21             }
    22             if (event==XmlPullParser.END_TAG&&xmlPullParser.getName().equals("company")) {
    23                 list.add(company);
    24             }
    25             xmlPullParser.next();
    26         }
    27         for (Company c : list) {
    28             System.out.println(c.getName());
    29             System.out.println(c.getPnum());
    30             System.out.println(c.getAddress());
    31             System.out.println("---------------------------------------");
    32         }
    33         
    34     }
    将xml数据通过pull解析器生成List集合
     1 package com.shellway.domain;
     2 
     3 import java.util.List;
     4 import org.junit.Test;
     5 
     6 public class XmlCURD {
     7     //删除数据
     8      @Test
     9      public void testDeleteFromXml() throws Exception{
    10          List<Company> companies = PullUtils.getDataForXml("xml/company_bak.xml");
    11          for (Company c : companies) {
    12                 if(c.getName().equals("Jerry")){
    13                      companies.remove(c);
    14                      //因为forech不允许改变长度,所以删了要一个break,且只能删除一个
    15                      break;
    16                 }
    17      }
    18         //回写
    19         PullUtils.setOutputForXml(companies, "xml/company_bak.xml"); 
    20  }
    21     
    22     //修改:要求名为shellway的公司人数增加到200%
    23     @Test
    24     public void testModifyFromXml() throws Exception{
    25         List<Company> companies = PullUtils.getDataForXml("xml/company.xml");
    26         for (Company c : companies) {
    27             if(c.getName().equals("shellway")){
    28                 c.setPnum(c.getPnum()*2);
    29             }
    30         }
    31         //回写
    32         PullUtils.setOutputForXml(companies, "xml/company_bak.xml"); 
    33     }
    34     
    35     //增加数据
    36     @Test
    37     public void testAddFromXml() throws Exception{
    38         //获取XML中的数据在内存中存放到List
    39         List<Company> companies = PullUtils.getDataForXml("xml/company.xml");
    40         Company company = new Company();
    41         company.setName("kkk");
    42         company.setPnum(1000);
    43         company.setAddress("南山区");
    44         companies.add(company);
    45         //回写
    46         PullUtils.setOutputForXml(companies, "xml/company_bak.xml"); 
    47     }
    48     //读取数据
    49     @Test
    50     public void testReadFromXml() throws Exception{
    51         List<Company> companies = PullUtils.getDataForXml("xml/company.xml");
    52         for (Company company : companies) {
    53             System.out.println(company.getName());
    54             System.out.println(company.getPnum());
    55             System.out.println(company.getAddress());
    56             System.out.println("--------------------------");
    57         }
    58     }
    59     
    60     @Test
    61     public void testPull() throws Exception{
    62         List<Company> companies = PullUtils.getDataForXml("xml/company.xml");
    63         PullUtils.setOutputForXml(companies, "xml/company_bak.xml");
    64     }
    65 }
    通过pull完成xml的CURD

    作业:
    1、整理 DOM 、SAX 、STAX 原理和区别
    2、编写商品xml文件 --- 通过JAXP DOM 完成CURD操作
    3、编写SAX运行案例 ----- 了解
    4、编写商品XML文件 --- 通过Pull解析器完成 CURD操作 ---- 重点 xml2List list2xml 两个方法

  • 相关阅读:
    PE格式详细讲解10 系统篇10|解密系列
    复杂的数据类型1 C++快速入门07
    复杂的数据类型2 C++快速入门08
    复杂的数据类型2 C++快速入门08
    复杂的数据类型1 C++快速入门07
    PE格式详细讲解10 系统篇10|解密系列
    Win32基础知识1 Win32汇编语言002
    开题篇 Win32汇编语言001
    开题篇 Win32汇编语言001
    Win32基础知识1 Win32汇编语言002
  • 原文地址:https://www.cnblogs.com/shellway/p/3945812.html
Copyright © 2011-2022 走看看