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 两个方法

你可能感兴趣的:(java)