一,schema約束
*dtd語法:<ELEMENT 元素名 約束>
*schema符合xml的語法,xml語句
**一個xml中可以有多個schema,多個schema使用名稱空間區分(類似java包名)
**dtd里面有PCDATA類型,但是在schema類面可以支持更多數據類型
**schema更加復雜,不能替代dtd
(1)schema快速入門
*w3c提供了屬性和標簽給schema
*在schema文件里面,以<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn/20151111" elementFormDefault="qualified"></schema>開頭
**xmlns:表示當前xml文件是一個約束文件
**targetNamespace:可以通過這個地址引入約束文件
*schema里面有多少元素就有多少個element
例如必須含有:<element name="person"></element name="age"><element name="name"></element>
*復雜元素:案例
<element name="person"><complexType><sequence><element name="name" type="string"></element><element name="age" type="int"></element></sequence></complexType></element>
*引入約束文件:
*案例:<person xmlns:xsi="schema中xmlns屬性-instance" xmlns="targetNamespace屬性" xsi:schemaLocation="targetNamespace 空格 schema文檔路徑"></person>
其中xsi這個是隨意取的名,也可以是xss......
<sequence></sequence>:元素出現的順序
<all></all>:元素只能出現一次
<choice></choice>:只能有其中過一個出現
<element name="age" type="int" maxOccurs="unbounded"></element>"表示元素出現的次數,此處是無限次
<any></any>:表示任意元素
*定義屬性:
<attribute name="id1" type="int" use="required">: 表示所有的元素必須有id1的屬性
name:屬性名稱
type:屬性類型
use:是否必須出現
(2)sax解析的原理
*解析xml有兩種技術 dom和sax
*根據xml的層級結構在內存中分配一個樹形結構
*把xml中標簽,屬性,文本封裝成對象
*sax:事件驅動,邊讀邊解析
*SAXParser
此類的實例可以從SAXParseFactory.newSAXParser();方法獲得
parse(File f,DefaultHandler dh);f:xml路徑 dh:事件處理器
*SAXParserFactory
-----------------------打印所有信息-----------------------
public class TestJaxp {
public static <DocumentBuildFactory> void main(String[] args) throws Exception
{
//創建解析工廠
SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
//創建解析器
SAXParser saxParser=saxParserFactory.newSAXParser();
//執行parser方法
saxParser.parse("src/NewFile.xml", new MyDefault());
}
}
class MyDefault extends DefaultHandler
{
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
System.out.print("<"+qName+">");
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
System.out.print("<"+qName+">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
System.out.print(new String(ch,start,length));
}
----------------得到某個元素的值-------------------
public class TestJaxp {
public static <DocumentBuildFactory> void main(String[] args) throws Exception
{
//創建解析工廠
SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
//創建解析器
SAXParser saxParser=saxParserFactory.newSAXParser();
//執行parser方法
saxParser.parse("src/NewFile.xml", new MyDefault());
}
}
class MyDefault extends DefaultHandler
{
boolean flag=false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if("TIME".equals(qName))
{
flag=true;
//System.out.print("<"+qName+">");
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
if("TIME".equals(qName))
{
flag=false;
//System.out.print("<"+qName+">");
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
if(flag==true)
{
System.out.print(new String(ch,start,length));
}
}
}
----------------------取第一個元素----------------------
public class TestJaxp {
public static <DocumentBuildFactory> void main(String[] args) throws Exception
{
//創建解析工廠
SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
//創建解析器
SAXParser saxParser=saxParserFactory.newSAXParser();
//執行parser方法
saxParser.parse("src/NewFile.xml", new MyDefault());
}
}
class MyDefault extends DefaultHandler
{
boolean flag=false;
int idx=1;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if("TIME".equals(qName))
{
flag=true;
//System.out.print("<"+qName+">");
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
if("TIME".equals(qName))
{
flag=false;
//System.out.print("<"+qName+">");
idx++;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
if(flag==true && idx==1)
{
System.out.print(new String(ch,start,length));
}
}
}