您的位置:首页 > 编程语言 > Java开发

JavaWeb——Day01_2

2014-10-14 10:00 323 查看
*6.两种解析思想

XML编程:

l一个XML文件除了我们人去读写以外,我们希望可以通过程序去读写,利用程序去增删改查XML的过程就是XML编程

lCRUD:Create、Read、Update、Delete

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解析的步骤整理:

l使用SAXParserFactory创建SAX解析工厂

SAXParserFactoryspf = SAXParserFactory.newInstance();

l通过SAX解析工厂得到解析器对象

SAXParser sp = spf.newSAXParser();

l通过解析器对象得到一个XML的读取器

XMLReader xmlReader =sp.getXMLReader();

l设置读取器的事件处理器

xmlReader.setContentHandler(newMyContentHandler());

l解析xml文件

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);
}
}


l创建解析器:

SAXReader reader = newSAXReader();

l利用解析器读入xml文档:

Document document=reader.read(newFile("input.xml"));

l获取文档的根节点:

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了。

lXML Schema 也是一种用于定义和描述 XML文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性
lSchema与 DTD的比较:
•XML Schema符合XML语法结构。
•DOM、SAX等XML API很容易解析出XML Schema文档中的内容。

•XML Schema对名称空间支持得非常好。

•XML Schema比XMLDTD支持更多的数据类型,并支持用户自定义新的数据类型。

•XMLSchema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
•XML Schema不能像DTD一样定义实体,比DTD更复杂,但XmlSchema现在已是w3c组织的标准,它正逐步取代DTD。

四、Schema -- xml的约束技术 --- 需要掌握名称空间的概念,会读简单的Schema就可以了,不需要大家自己会写

Schema是xml的约束技术,出现的目的是为了替代dtd

本身也是一个xml,非常方便使用xml的解析引擎进行解析

对名称空间有非常好的支持

支持更多的数据类型,并且支持用户自定义数据类型

可以进行语义级别的限定,限定能力大大强于dtd

相对于dtd不支持实体

相对于dtd复杂的多,学习成本比较的高

如何在xml中引入Schema --- !!!!!名称空间的概念:全世界独一无二的名字,用来唯一的标识某个资源,通常是公司的域名,只是名字而已并不真的表示资源的位置.

lXML Schema文件自身就是一个XML文件,但它的扩展名通常为.xsd。
l一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。
l和XML文件一样,一个XMLSchema文档也必须有一个根结点,但这个根结点的名称为Schema。
l编写了一个XMLSchema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过程,即把XMLSchema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束。



依据约束文档写实例文档:



怎么关联他们呢?

图、

两种书写对比:











默认是qualified,如果写unqualified的话,只是跟元素绑定在schema上了。

如何在xml中引入Schema --- !!!!!名称空间的概念:全世界独一无二的名字,用来唯一的标识某个资源,通常是公司的域名,只是名字而已并不真的表示资源的位置.

~~~ Schema的语法---参照Schema的文档,了解即可

*10.Schema语法简介

l参看w3c文档

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: