JavaWeb学习(五)

XML解析技术概述

  • XML解析方式分别两种:
    • dom:(Document Object Model,即文档对象模型)W3C组织推荐的解析XML的一种方式。
      • 缺点:内存消耗大
      • 优点:对文档增查改删容易
    • sax:(Simple API for XML)不是官方标准,但是XML社区事实上的标准,几乎所有的XML解析器都支持。
      • 缺点:不适合对文档增查改删,只适合读取
      • 优点:内存消耗小,解析速度快
    • 网易云课堂:调整jvm内存大小
      • jvm默认开辟64M内存

在这里插入图片描述

  • XML解析开发板
    • Jaxp(sun)、Jdom、dom4j

JAXP

  • JAXP开发包是J2SE的一部分,它由java.xml、org.w3c.dom、org.xml.sax包及其子包组成。
  • 在javax.xml.parsers包中,定义了几个工厂类,程序员调用这些工厂类,可以得到xml文件的DOM或SAX的解析器,从而实现对xml文档的解析。

使用JAXP进行DOM解析

  • javax.xml.parsers包中的DocumentBuilderFactory用于创建DOM模式的解析器对象,DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
  • dom解析下,xml文档的每一个组成部分都会用一个对象表示,例如标签用Element、属性用Attr、但不管什么对象,都是Node的子类,在开发中可以把获取到的任意节点都当作Node对待。

Demo1.java

package cn.itcast.xml;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

public class Demo1 {
	
	public static void main(String[] args) throws Exception{
		//创建工程
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//得到dom解析器
		DocumentBuilder builder =  factory.newDocumentBuilder();
		//解析xml文档,得到代表文档的document
		Document document = builder.parse("src/book.xml");
	}
}

更新XML文件

  • javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。
  • Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。
    • javax.xml.transform.dom.DOMSource类来关联要转换的document对象
    • 用javax.xml.transform.stream.StreamResult对象来表示数据的目的地
  • Transformer对象通过TransformerFactory获得。

DOM方式解析XML文件

  • DOM解析编程:
    • 遍历所有节点
    • 查找某一个节点
    • 删除节点
    • 更新节点
    • 添加节点
  • 编程练习:

Demo2.java

package cn.itcast.xml;

import java.io.FileOutputStream;
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;
import org.xml.sax.SAXException;

//使用dom方式对xml文档进行crud
public class Demo2 {
	
	//读取xml文档中:<书名>JavaScript网页开发</书名> 节点中的值
	@Test
	public void read1() throws Exception {
		//创建工程
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//得到dom解析器
		DocumentBuilder builder =  factory.newDocumentBuilder();
		//解析xml文档,得到代表文档的document
		Document document = builder.parse("src/book.xml");
		
		NodeList list = document.getElementsByTagName("书名");
		Node node = list.item(1);
		String content = node.getTextContent();
		System.out.println(content);
	}
	
	//读取xml文档中的所有标签
	@Test
	public void read2() throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder =  factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml");
		
		//得到根节点
		Node root = document.getElementsByTagName("书架").item(0);
		list(root);
	}
	
	public void list(Node node) {
		if(node instanceof Element) {
			System.out.println(node.getNodeName());
		}
		NodeList list = node.getChildNodes();
		for(int i = 0; i < list.getLength(); i ++) {
			Node child = list.item(i);
			list(child);
		}
	}
	
	//读取xml文档中标签属性的值:<书名 name="xxxx">Java就业培训教程</书名>
	@Test
	public void read3() throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder =  factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml");
		
		Element bookname = (Element) document.getElementsByTagName("书名").item(0);
		String value = bookname.getAttribute("name");
		System.out.println(value);
	}
	
	//向xml文档中添加节点:<售价>59.00元</售价>
	@Test
	public void add1() throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder =  factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml");
		
		//创建节点
		Element price = document.createElement("售价");
		price.setTextContent("59.00元");
		
		//把创建的节点挂到第一本书上
		Element book = (Element) document.getElementsByTagName("书").item(0);
		book.appendChild(price);
		
		//把更新后内存写回xml文档
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	//向xml文档中指定位置添加节点:<售价>59.00元</售价>
	@Test
	public void add2() throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder =  factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml");
		
		//创建节点
		Element price = document.createElement("售价");
		price.setTextContent("59.00元");
		
		//得到参考节点
		Element refNode = (Element) document.getElementsByTagName("售价").item(0);
		
		
		//得到要挂新节点的节点
		Element book = (Element) document.getElementsByTagName("书").item(0);
		
		//往book节点的指定位置插入新节点
		book.insertBefore(price, refNode);
		
		//把更新后内存写回xml文档
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	//向xml文档节点添加属性:<书名>Java就业培训教程</书名> 添加name="xxxx"
	@Test
	public void addAttr() throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder =  factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml");
		
		Element bookname = (Element) document.getElementsByTagName("书名").item(0);
		bookname.setAttribute("name", "xxxx");
		
		//把更新后内存写回xml文档
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	
	//向xml文档中删除节点:<售价>59.00元</售价>
	@Test
	public void delete1() throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder =  factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml");
		
		//得到要删除的节点
		Element e = (Element) document.getElementsByTagName("售价").item(0);
		
		//得到要删除节点的父节点
		Element book = (Element) document.getElementsByTagName("书").item(0);
		
		//父节点删除节点
		book.removeChild(e);
		
		//把更新后内存写回xml文档
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	//向xml文档中删除节点:<售价>59.00元</售价>
	@Test
	public void delete2() throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder =  factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml");
		
		//得到要删除的节点
		Element e = (Element) document.getElementsByTagName("售价").item(0);
		e.getParentNode().removeChild(e);
//		e.getParentNode().getParentNode().removeChild(e.getParentNode());	//将需删除节点的父节点删除
		
		//把更新后内存写回xml文档
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	//更新售价
	@Test
	public void updata() throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder =  factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml");
		
		Element e = (Element) document.getElementsByTagName("售价").item(0);
		e.setTextContent("109元");
		
		//把更新后内存写回xml文档
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
}

SAX解析

后期再学

发布了16 篇原创文章 · 获赞 7 · 访问量 921

猜你喜欢

转载自blog.csdn.net/weixin_41108819/article/details/97389578