6-day(XML&DOM_SAX&dom4j编程)

来源:互联网 发布:磁力解析app源码 编辑:程序博客网 时间:2024/05/17 22:57

XML&DOM_SAX&dom4j编程


Junit测试

测试方法的写法:

  • 方法必须是公有
  • 方法返回值必须是void
  • 方法的参数必须无参
  • 前面必须加 @Test注解
  • @before : 是每个测试方法执行之前都要调用一次此方法
  • @beforeclass:是所有测试方法执行之前必须要调用一次方法(只会调用一次)


XML文件概述

  • XML:可扩展标记语言(eXtensible Markup Language)

    • 传输数据
    • 配置文件(主要用途)
  • DTD(Document Type Definition):文档类型定义

  • XML解析:DOM方式和SAX方式

  • SAX:Simple API for XML

  • 解析开发包

    • JAXP:是SUN公司推出的解析标准
    • Dom4J:是开源组织推出的解析开发包(大家都在用)
    • JDom

book.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架><书 ISBN="黑莓">    <书名>葵花宝典</书名>    <作者>安倍晋三</作者>    <售价>        100        <内部件>50</内部件>    </售价>    <批发价>60</批发价></书><书>    <书名>金瓶梅</书名>    <作者>安倍晋四</作者>    <售价>80</售价></书></书架>

DOM_PARSEXML.java

package dom;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;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;//演示dom方式解析XML文件public class DOM_PARSEXML {public static void main(String[] args) throws Exception {    // 创建解析器对象    DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();    // 加载XML文档    Document document = db.parse("src/dom/book.xml");    // test1(document);    // test2(document);    // test3(document);    // test4(document);    // test5(document);    // test6(document);    test7(document);}// 1.得到具体某个节点内容:eg:拿到金瓶梅的售价public static void test1(Document document) {    // 拿到所有售价节点    NodeList list = document.getElementsByTagName("售价");    // 获得金瓶梅的售价节点    Node n = list.item(1);    // 获取售价文本    System.out.println(n.getTextContent());}// 2.遍历所有元素节点(递归)public static void test2(Node node) {    // 对node节点进行循环    NodeList n1 = node.getChildNodes();    // 循环判断    for (int i = 0; i < n1.getLength(); i++) {        Node n = n1.item(i);        if (n.getNodeType() == Node.ELEMENT_NODE) {            // 说明此节点是标签节点            System.out.println(n.getNodeName());            test2(n);        }    }}// 3.修改某个元素节点的主体内容eg:修改金瓶梅的价格public static void test3(Document document) throws Exception {    // 拿到所有售价节点    NodeList list = document.getElementsByTagName("售价");    // 获得金瓶梅的售价节点    Node n = list.item(1);    // 修改主体内容    n.setTextContent("80");    // 将修改结果保存的硬盘    Transformer tf = TransformerFactory.newInstance().newTransformer();    tf.transform(new DOMSource(document), new StreamResult("src/dom/book.xml"));}// 4. 向指定元素节点中增加子元素节点:eg :给葵花宝典的售价增加一个内部价节点:50public static void test4(Document document) throws Exception {    // 拿到所有售价节点    NodeList list = document.getElementsByTagName("售价");    // 获得葵花宝典的售价节点    Node n = list.item(0);    // 创建新的节点    Element el = document.createElement("内部价");    // 设置节点的主体内容    el.setTextContent("50");    // 将内部件节点挂接到售价节点上    n.appendChild(el);    // 保存到硬盘上    Transformer tf = TransformerFactory.newInstance().newTransformer();    tf.transform(new DOMSource(document), new StreamResult("src/dom/book.xml"));}// 5.向指定元素节点上增加同级元素节点: eg: 给葵花宝典的售价增加一个批发价节点:60public static void test5(Document document) throws Exception {    // 拿到所有书节点    NodeList list = document.getElementsByTagName("书");    // 获得葵花宝典的书节点    Node n = list.item(0);    // 创建新的批发价节点    Element el = document.createElement("批发价");    // 设置节点的主体内容    el.setTextContent("60");    // 将内部件节点挂接到售价节点上    n.appendChild(el);    // 保存到硬盘上    Transformer tf = TransformerFactory.newInstance().newTransformer();    tf.transform(new DOMSource(document), new StreamResult("src/dom/book.xml"));}// 6.删除指定元素节点 eg:删除内部价节点public static void test6(Document document) throws Exception {    // 拿到所有内部价节点    NodeList list = document.getElementsByTagName("内部价");    // 获得葵花宝典的内部价节点    Node n = list.item(0);    // 父亲干掉儿子    n.getParentNode().removeChild(n);    // 保存到硬盘上    Transformer tf = TransformerFactory.newInstance().newTransformer();    tf.transform(new DOMSource(document), new StreamResult("src/dom/book.xml"));}// 7.操作XML 文件属性: eg:给葵花宝典的书节点增加一个属性:ISBN: “黑莓”public static void test7(Document document) throws Exception {    // 拿到所有书节点    NodeList list = document.getElementsByTagName("书");    // 获得葵花宝典的书节点    Node n = list.item(0);    // 增加一个属性    ((Element) n).setAttribute("ISBN", "黑莓");    // 保存到硬盘上    Transformer tf = TransformerFactory.newInstance().newTransformer();    tf.transform(new DOMSource(document), new StreamResult("src/dom/book.xml"));}}

SAX解析示例

  • 在使用DOM解析XML文档时,需要读取整个XML文档,在内存中构架代表整个DOM树的Doucment对象,再对XML文档进行操作。
    • 此种情况下,如果XML文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出
  • SAX解析允许在读取文档的时候,即对文档进行操作处理,而不必等到整个文装载完

SAX_parseXML3.java

package sax;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;import bean.Book;//演示封装数据到JavaBean中public class SAX_parseXML3 {public static void main(String[] args) throws Exception {    // 创建sax解析器对象    SAXParser sax = SAXParserFactory.newInstance().newSAXParser();    // 获取内容读取器    XMLReader xml = sax.getXMLReader();    // 创建集合放置所有的书    List<Book> list = new ArrayList<Book>();    // 注册内容处理器    xml.setContentHandler(new DefaultHandler() {        String curName = "";// 记录当前是那个标签        int index = 0;// 记录读取到那个作者        Book book = null;        @Override        public void startElement(String uri, String localName, String qName, Attributes attributes)                throws SAXException {            if (qName.equals("书")) {                book = new Book();            }            curName = qName;        }        @Override        public void endElement(String uri, String localName, String qName) throws SAXException {            if (qName.equals("书")) {                list.add(book);            }            curName = null;        }        @Override        public void characters(char[] ch, int start, int length) throws SAXException {            if ("书名".equals(curName))                book.setBookName(new String(ch, start, length));            if ("作者".equals(curName))                book.setBookName(new String(ch, start, length));            if ("售价".equals(curName))                book.setBookName(new String(ch, start, length));        }    });    // 加载XML文档    xml.parse("src/sax/book.xml");    // 打印集合数据    for (Book book : list) {        System.out.println(book);    }}}  

Book.java

package bean;public class Book {private String bookName;private String author;private String price;public String getBookName() {    return bookName;}public void setBookName(String bookName) {    this.bookName = bookName;}public String getAuthor() {    return author;}public void setAuthor(String author) {    this.author = author;}public String getPrice() {    return price;}public void setPrice(String price) {    this.price = price;}@Overridepublic String toString() {    return "Book [bookName=" + bookName + ", author=" + author + ", price=" + price + "]";}}  

Book.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架><书>    <书名>葵花宝典</书名>    <作者>安倍晋三</作者>    <售价>100</售价></书><书>    <书名>金瓶梅</书名>    <作者>安倍晋四</作者>    <售价>80</售价></书></书架>  
原创粉丝点击