XML编程(day02)

一、小结

1、Jaxp的SAX方式解析(原理)

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class SaxDemo1 {

	public static void main(String[] args) throws Exception {
		//1、得到Sax解析器SAXParser
		SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
		//2、得到读取器XMLReader
		XMLReader reader = parser.getXMLReader();
		//3、要为读取器注册内容处理器ContentHandler
		reader.setContentHandler(new DefaultHandler(){
			@Override
			public void startDocument() throws SAXException {
				System.out.println("文档的开始");
			}
			@Override
			public void startElement(String uri, String localName, String qName,
					Attributes atts) throws SAXException {
				System.out.println("当前解析到了开始元素:"+localName);
			}

			@Override
			public void characters(char[] ch, int start, int length)
					throws SAXException {
				System.out.println("当前解析到的文本内容是:"+new String(ch,start,length));
			}
			@Override
			public void endElement(String uri, String localName, String qName)
					throws SAXException {
				System.out.println("当前解析到了结束元素:"+qName);
			}
			@Override
			public void endDocument() throws SAXException {
				System.out.println("文档的结束");
			}
		});
		//4、读取xml文档
		reader.parse("src/book.xml");
	}

}

2、SAX的小练习

import java.io.IOException;
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 com.itheima.domain.Book;
//把读到的xml数据封装到Bean中
public class SaxDemo3 {

	public static void main(String[] args) throws Exception, SAXException {
		SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
		XMLReader reader = parser.getXMLReader();
		MyContentHandler3 mch = new MyContentHandler3();
		reader.setContentHandler(mch);
		reader.parse("src/book.xml");
		List<Book> books = mch.getBooks();
		for(Book b:books){
			System.out.println(b);
		}
		
	}

}
class MyContentHandler3 extends DefaultHandler{
	private List<Book> books = new ArrayList<Book>();
	Book b = null;
	String currentTagName = null;
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		currentTagName = qName;
		if("书".equals(qName)){
			b = new Book();
		}
	}
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if("书名".equals(currentTagName)){
			b.setName(new String(ch,start,length));
		}
		if("作者".equals(currentTagName)){
			b.setAuthor(new String(ch,start,length));
		}
		if("售价".equals(currentTagName)){
			b.setPrice(new String(ch,start,length));
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if("书".equals(qName)){
			books.add(b);
		}
		currentTagName = null;
	}
	public List<Book> getBooks() {
		return books;
	}
	
}


3、DOm4J的CRUD

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Assert;
import org.junit.Test;

public class Dom4JCRUD {
//	1、得到某个具体的节点内容
	//第1本书的作者的主体内容
	@Test
	public void test1() throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
//		Element root = document.getRootElement();
//		Element firstBook = root.element("书");
//		Element firstAuthor = firstBook.element("作者");
//		Assert.assertEquals("王昭珽", firstAuthor.getText());
//		Assert.assertEquals("王昭珽", firstBook.elementText("作者"));
		String content = document.getRootElement().element("书").elementText("作者");
		Assert.assertEquals("王昭珽", content);
	}
	@Test//xpath
	public void test11() throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		String xpath = "//书[1]/作者";
		Node node = document.selectSingleNode(xpath);
		
		Assert.assertEquals("王昭珽", node.getText());
	}
//	2、遍历所有元素节点:递归
	@Test
	public void test2()throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		treeWalk(document.getRootElement());
	}
	public void treeWalk(Element e){
		System.out.println(e.getName());
		int childNum = e.nodeCount();//孩子的数量
		for(int i=0;i<childNum;i++){
			Node node = e.node(i);
			if(node.getNodeType()==Node.ELEMENT_NODE){//node instanceof Element
				treeWalk((Element)node);
			}
		}
	}
//	3、修改某个元素节点的主体内容
	//<售价>29.00元</售价>   30
	@Test
	public void test3()throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
		//得到第2本书的售价
		List<Element> list = root.elements();
		//修改它的主体内容
		Element price = list.get(1).element("售价");
		price.setText("31.00元");
		//写回xml文档
		OutputStream out = new FileOutputStream("src/book.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
//		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(out,format);//默认编码就是UTF-8
		writer.write(document);
		writer.close();
	}
//	4、向指定元素节点中增加子元素节点
	//向第1本书中增加孩子<批发价>10</批发价>
	@Test
	public void test4()throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
		Element book = root.element("书");
		book.addElement("批发价").addText("10.00元");
		OutputStream out = new FileOutputStream("src/book.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
//		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(out,format);//默认编码就是UTF-8
		writer.write(document);
		writer.close();
	}
//	5、向指定元素节点上增加同级元素节点
	//第1本书的售价前面增加<内部价>20</内部价>
	@Test
	public void test5()throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
		
		List<Element> list = root.element("书").elements();
		//创建新元素,加到list的第2个位置
		Element price = DocumentHelper.createElement("内部价").addText("20.00元");
		list.add(2, price);
		
		OutputStream out = new FileOutputStream("src/book.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
//		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(out,format);//默认编码就是UTF-8
		writer.write(document);
		writer.close();
	}
//	6、删除指定元素节点:批发价
	@Test
	public void test6()throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
		
		//得到批发价元素,用它的爸爸干掉他
		Element price = root.element("书").element("批发价");
		price.getParent().remove(price);
		
		OutputStream out = new FileOutputStream("src/book.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
//		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(out,format);//默认编码就是UTF-8
		writer.write(document);
		writer.close();
	}
//	7、操作XML文件属性:读取属性
	@Test
	public void test7()throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
		
		Element book = root.element("书");
		String value = book.attributeValue("ISBN");
		Assert.assertEquals("abc", value);
		
	}
	@Test
	public void test71()throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		String xpath = "//书[1]";
		Node node = document.selectSingleNode(xpath);
		String value = node.valueOf("@ISBN");
		Assert.assertEquals("abc", value);
		
	}
	@Test//选择某本书,ISBN="abc" 出版社="小黑驹出版社"
	public void test72()throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		String xpath = "//书[@ISBN='abc' and @出版社='小黑驹出版社']";
		Node node = document.selectSingleNode(xpath);
		Assert.assertEquals("书", node.getName());
		
	}
	//8\添加属性:第一本书添加一个出版社
	@Test
	public void test8()throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
		
		Element book = root.element("书");
		book.addAttribute("出版社", "小黑驹出版社");
		
		OutputStream out = new FileOutputStream("src/book.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
//		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(out,format);//默认编码就是UTF-8
		writer.write(document);
		writer.close();
	}
	@Test
	public void test9()throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		System.out.println(document.asXML());
	}
}


4、Junit单元测试
5、Dom4J改写原来的案例(感受分层的好处)
6、Xpath的语法
7、解耦

单例设计模式

简单工厂设计模式

ResourceBundle读取*.properties配置文件

import java.util.ResourceBundle;

import com.itheima.dao.StudentDao;

public class ObjectFactory {
	private static String daoImplClass;//实现类的完整类名
	static{
		ResourceBundle rb = ResourceBundle.getBundle("com.itheima.dao.daocfg");
		daoImplClass = rb.getString("studentDao");
	}
	private static ObjectFactory instance = new ObjectFactory();
	private ObjectFactory(){}
	public static ObjectFactory getInstance(){
		return instance;
	}
	
	public StudentDao getStudentDao(){
		try {
			return (StudentDao)Class.forName(daoImplClass).newInstance();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}



8、Schema验证(根据Schema写出XML文档。看懂Schema)


一、根据Schema编写XML实例文档的步骤


1、查看schema文档,找到根元素(第一个element声明的)
<?xml version="1.0" encoding="UTF-8"?>
<书架>


</书架>
2、疑问:书架来自哪个名称空间呢?
查看schema文档,找到根元素schema,找到他的targetNamespace,就是实例文档中书架来自的名称空间
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:itcast="http://www.itcast.cn">


</书架>
3、疑问:http://www.itcast.cn名称空间对应的xsd文件在何处?
用schemaLocation来指明名称空间和xsd的对应关系
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:itcast="http://www.itcast.cn"
schemaLocation="http://www.itcast.cn book.xsd">


</书架>
4、疑问:schemaLocation来自哪个名称空间呢?
它来自标准(固定的)的名称空间
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:itcast="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn book.xsd">


</书架>
5、修改“书架”根元素,指明它的名称空间
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn book.xsd">

</itcast:书架>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值