JavaWeb——Day01_2

*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>




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值