day02XML2+JUNIT+Properties

来源:互联网 发布:淘宝抢单神器软件 编辑:程序博客网 时间:2024/05/18 11:28

1.    四种xml的数据解析方法

1.      dom 方法 jaxp

2.      sax方法 jaxp

3.      pull方法 xmlpull

4.      dom4j方法

2.DOM方式

全名:document object Model 文档对象模型

这种方式是w3c处理xml文件的一种方式(构建树,以节点形式操作)

 

JAXP进行DOM方式解析,SUN公司指定的。包含在JDK中。

 

优点:把xml文档当做一个树对待;对于增删改查非常方便

缺点:必须加载整个xml文档才能构建此树,当xml过大时有可能会内存泄露

包:org.w3c.*

 

 

dom读取步骤(Document)

 

//1.通过Document解析器工厂获得Document解析器

DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();

 

//2.使用Document解析器解析所在位置xml

Document document= db.parse(path);

 

dom写入步骤

//1通过transformer(转换器)工厂获得transformer对象

Transformer tf = TransformerFactory.newInstance().newTransformer();

//2.通过transformer对象将内存中的document对象写入xml文件中

tf.transform(newDOMSource(document),new StreamResult(path));

2.    SAX 方式(推,被动)

全名:simple api for xml

这种方式不是官方标准。属于开源社区

 

JAXP进行SAX方式解析

 

优点:读取到文档的某一部分就解析,占用内存小。(注意:SAX会读取回车换行空白的部分(当成文本来读)

缺点:只能读

包:org.sax.*;

//注意:sax解析器会把回车换行也解析进去,如果不把currentName置为空,则会出现内容为空

public class MySaxTest2 {

    public static void main(String[] args)throws Exception{

        //第一步:通过sax解析器工厂获取解析器

        SAXParser sax = SAXParserFactory.newInstance().newSAXParser();

        //第二步:获取读取器

        XMLReader reader = sax.getXMLReader();

        //第三步:向读取器注册内容事件

        MyDefault md = new MyDefault();

        reader.setContentHandler(md);

        //第四步:解析xml

        reader.parse("src/books.xml");

        List<Book> books = md.getBooks();

        for(Book book : books){

            System.out.println(book);

        }

    }

}

class MyDefaultextends MyDefaultContentHandler{

   

    List<Book> books = new ArrayList<Book>();

    Book book = null;

    String currentName = "";

    //XML中的数据封装到JavaBean

    public void startElement(String uri, String localName, String qName,

            Attributes atts) throws SAXException {

        if("".equals(qName)){

            book = new Book();

        }

        currentName = qName;

 

    }

    public void characters(char[] ch,int start, int length)

            throws SAXException {

        if("书名".equals(currentName)){

            book.setName(new String(ch,start,length));

        }

        if("作者".equals(currentName)){

            book.setAuthor(new String(ch,start,length));

        }

        if("售价".equals(currentName)){

            book.setPrice(Float.parseFloat(newString(ch,start,length)));

        }

           

    }

    public void endElement(String uri, String localName, String qName)

            throws SAXException {

        if("".equals(qName)){

            books.add(book);

        }

        //注意:sax解析器会把回车换行也解析进去,如果不把currentName置为空,则会出现内容

        为空

        currentName = "";

    }

        public List<Book>getBooks(){

            returnbooks;

        }

}

 

SAX读取步骤:(XMLReader)

 

//1.通过sax工厂得到解析器SAXParser

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

 

//2.获取读取器XMLReader

XMLReader reader = parser.getXMLReader();

 

//3.在读取器上注册内容处理器ContentHandler,接口方法过多可用适配器

reader.setContentHandler(new ContentHandler(){});

 

//4.解析xml文件

reader.parse("src/books.xml");

 

3.    PULL方式(拉,主动)

这种方式不是官方标准

 

XMLPULL进行PULL解析

 

优点:读取到文档的某一部分就解析,占用内存小。

缺点:只能读

包(需要jar):Org.xmlpull.*;

 

Pull方式读取步骤:(XmlPullParser)

    //1.通过工厂获得解析器

XmlPullParser pull = XmlPullParserFactory.newInstance().newPullParser();

    //2.以字节流的形式输入内容。编码要与xml中声明的编码保持一致

       pull.setInput(new FileInputStream("src/books.xml"),"utf-8");

    //3.通过pull得到事件类型

       int type = pull.getEventType();

       while(type != XmlPullParser.END_DOCUMENT){

           if(type == XmlPullParser.START_DOCUMENT){

              System.out.println("文档的开始");

           }

           if(type == XmlPullParser.START_TAG){

              System.out.println("元素的开始");

           }

           if(type == XmlPullParser.END_TAG){

              System.out.println("元素的结束");

           }

           if(type == XmlPullParser.TEXT){

              System.out.println("文本");

           }

           //4.得到下一个事件类型,千万别忘记了!

       type = pull.next();

       }

4.    DOM4J方式(推荐)

Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性

   注意:需要引入jar包

 

 

 

DOM4j中,获得Document对象的方式有三种:

       1.读取XML文件,获得document对象            

        SAXReader reader = new SAXReader();
             Document   document = reader.read(new File("input.xml"));

 

       2.解析XML形式的文本,得到document对象.

         String text ="<members></members>";
             Document document = DocumentHelper.parseText(text);

 

       3.主动创建document对象.

          Document document =DocumentHelper.createDocument();
            //创建根节点

       Element root = document.addElement("members");

 

 

 

Dom4j的读取步骤(document)

//1.获得SAX读取器

    SAXReader sr = new SAXReader();

    //2.获得document

Document document = sr.read("src/books.xml");

 

Dom4j的写入步骤:

    //1.获得输出格式

    OutputFormat format = OutputFormat.createPrettyPrint();

    format.setEncoding("utf-8");

    //2.得到以字节流的形式输出的XMLWriter

XMLWriter writer =

 new XMLWriter(new FileOutputStream("src/books.xml"), format);

    //3.document写入xml文件

    writer.write(document);

    //4.特别注意关闭流,因为有缓冲

writer.close();

 

 

xpath语法(熟悉),xpathjdbc都是下标为1开始,其他为0

 

 

5.     xml的scheme约束

Schema约束本身就是一个xml文件,扩展名为xsd

 

编写头部信息步骤:

1.查看Schema文档,找到根元素。

<书架>

</书架>

2.首先设置名称空间(xxx

schema文档中的根元素的targetNamespace指定了名称空间。

XML中引入该名称空间即可。使用xmlns关键字

 

<itheima:书架 xmlns:itheima="xxx">

</itheima:书架>

 

3.xxx名称空间对应的xsd文件所在位置

使用schemaLocation去指定:xsd名称空间 xsd的路径

 

<itheima:书架 xmlns:itheima="xxx">

        schemaLocation="http://www.itcast.cnbook.xsd">

</itheima:书架>

 

4.xsd所对应的标准名称空间

来自一个标准的名称空间,需要使用xmlns来声明:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 

<itheima:书架xmlns:itheima="http://www.itcast.cn"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://www.itcast.cnbook.xsd">

</itheima:书架>

 

注意:xmlns声明关键字可以申明默认名称空间

如:xmlns =”xxx”;

6.    properties文件

1.旧方法:

//1.创建Properties对象

    Properties p = new Properties();

//2.以输入流的形式装载xml文件(需要写src)

    p.load(new FileInputStream("src/student.properties"));

//3.通过键取得值

    Stringvalue = p.getProperty("StudentDao");

 

2.新方法:

//1.获得资源绑定对象(如果在src下直接为student,不要后缀名,不要src

    ResourceBundle rb = ResourceBundle.getBundle("student");

//如果放在某个包中则包的路径名也要写

ResourceBundle rb = ResourceBundle.getBundle("com/itheima/util/student");

//2.使用资源绑定对象通过键来获得值

    String value = rb.getString("StudentDao");

 

7.    JUnit方法

       注意事项:

       1.导入JUnit包

       2.测试类必须在方法上面写@Test来说明为Test

       3.访问权限必须为public

       4.方法不能有参数        

原创粉丝点击