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</售价></书></书架>
阅读全文
1 0
- 6-day(XML&DOM_SAX&dom4j编程)
- 黑马程序员Android第55期——xml&dom_sax&dom4j编程
- XML编程-DOM4J
- Java解析XML之dom_sax方式
- Xml编程---Dom4j解析工具
- 心得6--XML编程(CRUD)--DOM4J精讲
- Java编程操作XML文件(生成方法四:DOM4J)
- Javaweb-xml编程-Dom4j解析xml文档
- XML解析(dom4j)
- XML解析(Dom4j)
- dom4j语法(xml)
- day day up--Java编程之SAX解析XML文件
- 如何用DOM4J编程使用xml schema
- 传智播客学习之XML编程-DOM4j
- XML基础编程解析(DOM SAX Dom4J)
- Dom4j生成xml(转载)
- Dom4j解析xml(二)
- Dom4j解析xml(二)
- Android多线程之Handler
- 23种设计模式(1)-单例模式
- 【C#】枚举与Description配合使用实例
- leetcode 36. Valid Sudoku
- java 流
- 6-day(XML&DOM_SAX&dom4j编程)
- 分享一个简单的基础数据库模型
- linux(九)之网络基础
- 4.32 leetcode -32 maximum-subarray
- UVALive4043[Ants] 二分图完美匹配 KM算法
- PDD笔试-小熊吃糖
- 23种设计模式(2)-工厂模式
- 集合第三节
- 数组