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:书架>