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

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 :给葵花宝典的售价增加一个内部价节点:50
public 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: 给葵花宝典的售价增加一个批发价节点:60
public 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;
}

@Override
public String toString() {
    return "Book [bookName=" + bookName + ", author=" + author + ", price=" + price + "]";
}

}  

Book.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架>
<书>
    <书名>葵花宝典</书名>
    <作者>安倍晋三</作者>
    <售价>100</售价>
</书>
<书>
    <书名>金瓶梅</书名>
    <作者>安倍晋四</作者>
    <售价>80</售价>
</书>
</书架>  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值