*6.两种解析思想
XML编程:
Dom和Sax解析。
一般开发来看,sax解析常用。但是我们主讲dom解析。
android里面的xml解析是pull解析,是基于sax解析的。
*7.sax解析_dom4j解析入门
sax解析目前不做掌握,到了Android开发的时候,会回继续学习pull解析,这里只做一个演示。
演示一个sax解析。
package com.itheima.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.获取解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.通过工厂获取sax解析器
SAXParser parser = factory.newSAXParser();
//3.获取读取器
XMLReader reader = parser.getXMLReader();
//4.注册事件处理器
reader.setContentHandler(new MyContentHandler2() );
//5.解析xml
reader.parse("book.xml");
}
}
//适配器设计模式
class MyContentHandler2 extends DefaultHandler{
private String eleName = null;
private int count = 0;
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
this.eleName = name;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("书名".equals(eleName) && ++count==2){
System.out.println(new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
eleName = null;
}
}
class MyContentHandler implements ContentHandler{
public void startDocument() throws SAXException {
System.out.println("文档解析开始了.......");
}
public void startElement(String uri, String localName, String name,
Attributes atts) throws SAXException {
System.out.println("发现了开始标签,"+name);
}
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
public void endElement(String uri, String localName, String name)
throws SAXException {
System.out.println("发现结束标签,"+name);
}
public void endDocument() throws SAXException {
System.out.println("文档解析结束了.......");
}
public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub
}
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
}
public void processingInstruction(String target, String data)
throws SAXException {
// TODO Auto-generated method stub
}
public void setDocumentLocator(Locator locator) {
// TODO Auto-generated method stub
}
public void skippedEntity(String name) throws SAXException {
// TODO Auto-generated method stub
}
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
// TODO Auto-generated method stub
}
}
--------------------------------------------------------------------上面是sax解析---------------------------------------------------
sax解析的步骤整理:
SAXParserFactoryspf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xmlReader =sp.getXMLReader();
xmlReader.setContentHandler(newMyContentHandler());
xmlReader.parse("book.xml");
关于sax解析,其他需要知道的:
----
三、XML编程:利用java程序去增删改查(CRUD)xml中的数据
解析思想:
dom解析
sax解析
基于这两种解析思想市面上就有了很多的解析api
sun jaxp既有dom方式也有sax方式,并且这套解析api已经加入到j2se的规范中,意味这不需要导入任何第三方开发包就可以直接使用这种解析方式.但是这种解析方式效率低下,没什么人用.
dom4j 可以使用dom方式高效的解析xml.
pull
!!dom4j
导入开发包,通常只需要导入核心包就可以了,如果在使用的过程中提示少什么包到lib目录下在导入缺少的包即可
接下来 我们讲一下Dom4j技术。
演示一下Dom4j。
package com.itheima.dom4j;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jDemo1 {
public static void main(String[] args) throws Exception {
//1.获取解析器
SAXReader reader = new SAXReader();
//2.解析xml获取代表整个文档的dom对象
Document dom = reader.read("book.xml");
//3.获取根节点
Element root = dom.getRootElement();
//4.获取书名进行打印
String bookName = root.element("书").element("书名").getText();
System.out.println(bookName);
}
}
SAXReader reader = newSAXReader();
Document document=reader.read(newFile("input.xml"));
Element root =document.getRootElement();
*8.dom4j进行增删改查
增:
上面这种方法比较原始。
改:
删除:
属性:
增属性:
改属性:
和上面一样,只是把值变了。
获取属性:
删除一个属性:
-------------小结------------------
package com.itheima.dom4j;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
public class Demo4jDemo2 {
@Test
public void attr() throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("book.xml");
Element root = dom.getRootElement();
Element bookEle = root.element("书");
//bookEle.addAttribute("出版社", "传智出版社");
// String str = bookEle.attributeValue("出版社");
// System.out.println(str);
Attribute attr = bookEle.attribute("出版社");
attr.getParent().remove(attr);
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
@Test
public void del() throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("book.xml");
Element root = dom.getRootElement();
Element price2Ele = root.element("书").element("特价");
price2Ele.getParent().remove(price2Ele);
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
@Test
public void update()throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("book.xml");
Element root = dom.getRootElement();
root.element("书").element("特价").setText("4.0元");
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
@Test
public void add()throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("book.xml");
Element root = dom.getRootElement();
//凭空创建<特价>节点,设置标签体
Element price2Ele = DocumentHelper.createElement("特价");
price2Ele.setText("40.0元");
//获取父标签<书>将特价节点挂载上去
Element bookEle = root.element("书");
bookEle.add(price2Ele);
//将内存中的dom树会写到xml文件中,从而使xml中的数据进行更新
// FileWriter writer = new FileWriter("book.xml");
// dom.write(writer);
// writer.flush();
// writer.close();
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
@Test
public void find() throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("book.xml");
Element root = dom.getRootElement();
List<Element> list = root.elements();
Element book2Ele = list.get(1);
System.out.println(book2Ele.element("书名").getText());
}
}
*9.Schema之名称空间
Schema是另一种约束。dtd已经out了。
四、Schema -- xml的约束技术 --- 需要掌握名称空间的概念,会读简单的Schema就可以了,不需要大家自己会写
Schema是xml的约束技术,出现的目的是为了替代dtd
本身也是一个xml,非常方便使用xml的解析引擎进行解析
对名称空间有非常好的支持
支持更多的数据类型,并且支持用户自定义数据类型
可以进行语义级别的限定,限定能力大大强于dtd
相对于dtd不支持实体
相对于dtd复杂的多,学习成本比较的高
如何在xml中引入Schema --- !!!!!名称空间的概念:全世界独一无二的名字,用来唯一的标识某个资源,通常是公司的域名,只是名字而已并不真的表示资源的位置.
依据约束文档写实例文档:
怎么关联他们呢?
图、
两种书写对比:
默认是qualified,如果写unqualified的话,只是跟元素绑定在schema上了。
如何在xml中引入Schema --- !!!!!名称空间的概念:全世界独一无二的名字,用来唯一的标识某个资源,通常是公司的域名,只是名字而已并不真的表示资源的位置.
~~~ Schema的语法---参照Schema的文档,了解即可
*10.Schema语法简介
html css javas dom xml 都是w3c发布的。
约束文档:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="www.itheima.com"
elementFormDefault="qualified"
>
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
实例文档:
<?xml version="1.0" encoding="utf-8" ?>
<itheima:shiporder xmlns:itheima="www.itheima.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="www.itheima.com shiporder.xsd" orderid="asdf" >
<itheima:orderperson>asdf</itheima:orderperson>
<itheima:shipto>
<itheima:name>zzzz</itheima:name>
<itheima:address>ssss</itheima:address>
<itheima:city>sdfdf</itheima:city>
<itheima:country>sdfdf</itheima:country>
</itheima:shipto>
<itheima:item>
<itheima:title>sadfdsf</itheima:title>
<itheima:note>sdfdsfdsf</itheima:note>
<itheima:quantity>10</itheima:quantity>
<itheima:price>100.99</itheima:price>
</itheima:item>
<itheima:item>
<itheima:title>sadfdsf</itheima:title>
<itheima:note>sdfdsfdsf</itheima:note>
<itheima:quantity>10</itheima:quantity>
<itheima:price>100.99</itheima:price>
</itheima:item>
</itheima:shiporder>