XML_day01_pm
1.XML可宽展编辑语言
  指令:帮助解析文件解析指定信息
  1.页面注释:顶格写;
  2.标记必须是成对的;
  3.根元素只能有一个;
  4.元素的属性必须出现在起始标记里;
  5.属性必须有值,且属性值必须加引号“”;
  6.元素可以有子元素(或说成元素可以有子元素);
  7.元素不能交叉;
  8.元素体中可以有文本(非解析文本);
 
 

2.什么是DTD(XML元素说明文件)
3.DTD中内容说明:
标签<ELEMENT>的作用:对某元素的元素体进行说明;
#PCDATA-》可解析的字符信息;

XML_Schema_day_01_am
1.什么是Schema(计划):schema是一种基于xml的类dtd,他描述了xml文件的架构,XML Schema也是指XML Schema 定义(.xsd),xml的目的在于定义一个合法的创建xml文档块,类似于DTD.
2.命名空间:DTD不支持命名空间,而Schema(.xsd)支持命名空间;
命名空间定义句型:xmlns:prefix=”URL”,如:

<books:book xmlns=:books='http://www.library.com/books'> 
  <books:title>this book</books:title> 
</books:book> 
3.Schema的元素: 
    a.简单元素--》只包含文本的元素; 
    句型:<xs:element name=”xxx” type=”yyy”/> 
    schema中有很多内置的type 
    type常用类型:xs:string   xs:decimal  xs:integer xs:boolean xs:date xs:time 
    如,<xs:element name=”price” type=”xs:double”/> 
        属性默认是可选的: 
        <xs:element name=”price”type=”xs:double” default=”10”/> 
        <xs:element name=”price” type=”xs:double” use=”required”/> 


   简单类型(元素体类型,不包括属性声明)定义的实例: 
  <xs:simpleType name=”myType”> 
     <xs:restriction base=”xs:integer”>//整数上加一个范围的约束[0,120] 
       <xs:minInclusive value=”0”/> 
       <xs:maxInclusive value=”120”/> 
    </xs:restriction> 
  </xs:simpleType> 
  复杂类型实例(元素体类型,包括属性的声明): 
  <xs:schema  xmlns:xs='http://www.w3.org/2001/XMLSchema'> 
    <xs:element name=”quantity”> 
       <xs:simpleContent> 
        <xs:extension base='xs:nonNegativeInteger'>//基于无非负整数的扩展 
           <xs:attribute name='backorderable'  type='xs:boolean' default='false'/> 
         </xs:extension> 
       </xs:simpleContent> 
    </xs:element> 
  </xs:schema> 

利用上述schema控制的有效的xml片段: 
<quantity backorderable='true'>1</quantity> 
无效的片段: 
<quantity orderable='true'>2</quantity>



4.         Xpath和Parsers(解析器)
 


       
   





                                  图 SAX 操作模型


5.JDK中xml解析器SAX所在的包:javax.xml.parsers.*:

javax.xml.parsers.SAXParser类的常用方法: 
public void parse(InputSource is, DefaultHandler dh)  throws SAXException,  IOException 
使用指定的 DefaultHandler 将给定 InputSource 的内容解析为 XML。 
    参数: is - 包含要解析内容的 InputSource。 dh - 要使用的 SAX DefaultHandler。 
      抛出: 
        IllegalArgumentException - 如果 InputSource 对象为 null。 
        IOException - 如果发生任何 IO 错误。 
        SAXException - 如果在处理过程中发生任何 SAX 错误。 
    另请参见: 
        DocumentHandler 


一个SAXParser类的实例: 
package tang.xml.parser; 

import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class MyHandler extends DefaultHandler { 

public void startDocument()throws SAXException{ 
System.out.println("document started..."); 
} 
public void endDocument()throws SAXException{ 
System.out.println("document ended...."); 
} 
} 

package tang.xml.parser; 

import java.io.FileInputStream; 
import java.io.InputStream; 

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

public class MyHanlderParser { 

/** 
*解析xml文件的解析器测试 
*/ 
public static void main(String[] args) throws Exception { 
InputStream in = null; 
SAXParser parser = null; 
SAXParserFactory fac = SAXParserFactory.newInstance(); 
in = new FileInputStream( 
"/home/soft01/jdbcproject/day05/src/tang/xml/parser/books.xml"); 
parser = fac.newSAXParser(); 
parser.parse(in, new MyHandler()); 
in.close(); 
} 

} 
结果: 
document started... 
document ended.... 
<?xml version="1.0" encoding="UTF-8"?> 
<!-- books.xml contents --> 
<books> 
<book id="b001"> 
  <name>xiaohua</name> 
   <authuor>tangzhiqiang</authuor> 
   <title>Java</title> 
   <price>10.1</price> 
</book> 
<book id="b002"> 
<name>bingb</name> 
<authuor>tangyi</authuor> 
<title>HTML</title> 
<price>sheng</price> 
</book> 
</books>






XML_Schema_day_01_pm 
1.xml解析的完整实例: 
读取xml文件的实现类 
package tang.xml.parser; 

import org.xml.sax.SAXException; 
import org.xml.sax.Attributes; 
import org.xml.sax.helpers.DefaultHandler; 

public class MyHandler extends DefaultHandler { 

// 获取标签中的数据 
public void characters(char[] c, int start, int length) throws SAXException { 
System.out.print(new String(c, start, length)); 
} 

// 获得起始标签 
public void startElement(String uri, String loacleName, String qName, 
Attributes attrs) { 
StringBuffer sb = new StringBuffer(); 
sb.append("<" + qName + " ");//取得起始元素名称 
//通过循环获得标签的属性(可能有多个属性) 
for (int i = 0; i < attrs.getLength(); i++) { 
sb.append(attrs.getQName(i) + "=");//获得属性名 
sb.append("'" + attrs.getValue(i) + "'");//获得属性值 
} 
sb.append(">"); 
System.out.print(sb.toString()); 
} 

// 获得结束标签 
public void endElement(String uri, String localeName, String qName) { 
StringBuffer sb = new StringBuffer(); 
sb.append("</" + qName + ">"); //获得标签后缀名称 
System.out.print(sb); 
} 

// 开始读文件 
public void startDocument() throws SAXException { 
System.out.println("document started..."); 
} 

// 结束读文件 
public void endDocument() throws SAXException { 
System.out.println("document ended...."); 
} 
} 
调用解析器的主类 

package tang.xml.parser; 

import java.io.FileInputStream; 
import java.io.InputStream; 

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

public class MyHanlderParser { 

/** 
*解析xml文件的解析器测试 
*/ 
public static void main(String[] args) throws Exception { 
InputStream in = null; 
SAXParser parser = null; 
SAXParserFactory fac = SAXParserFactory.newInstance(); 

in = new FileInputStream( 
"/home/soft01/jdbcproject/day05/src/tang/xml/parser/books.xml"); 
parser = fac.newSAXParser(); 
parser.parse(in, new MyHandler()); 

in.close(); 

} 

} 
读取的结果: 
document started... 
<books > 
<book id='b001'> 
  <name >xiaohua</name> 
   <authuor >tangzhiqiang</authuor> 
   <title >Java</title> 
   <price >10.1</price> 
</book> 
<book id='b002'> 
  <name >bingb</name> 
  <authuor >tangyi</authuor> 
  <title >HTML</title> 
  <price >sheng</price> 
</book> 
</books>document ended.... 

2.DOM in Action 
  
   





                            图- DOM模型图 
DOM的缺点:比较占内存; 
            
DOM操作所用到的类包org.w3c.dom.*; 
   org.w3c.dom.DocumentBuilderFactory 
   org.w3c.dom.DocumentBuilder 
   org.w3c.dom.Document 
   对象生成顺序: 
   
   org.w3c.dom.Node类常用方法:getXXX()/setXXX() 
                             getFirstChild()获得根节点 
                             getLastChild()获得最后一个节点 
                             getNextSibling()获得兄弟节点 
   org.w3c.dom.Document类 
   org.w3c.dom.Element类 常用方法getElementsByTagName(String name) 
                                getAttribute(String name); 
                                
使用DOM的实例: 
package tang.xml.parser; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.xml.sax.SAXException; 



public class MyDocumentLab { 

/** 
* DOM模型实例 
*/ 
public static void main(String[] args) { 
        FileInputStream in=null; 
Document doc=null; 
DocumentBuilder builder=null; 
DocumentBuilderFactory fac=null; 
fac=DocumentBuilderFactory.newInstance(); 
try { 
//获得Document对象 
builder=fac.newDocumentBuilder(); 
in=new FileInputStream("/home/soft01/jdbcproject/day05/src/tang/xml/parser/books.xml"); 
doc=builder.parse(in); 

//获得Element对象 
StringBuffer sb=new StringBuffer(); 
Element root=doc.getDocumentElement(); 
sb.append(root.getNodeName()+"\n"); 
sb.append(root.getTagName()); 
System.out.println(sb); 

} catch (ParserConfigurationException e) { 
e.printStackTrace(); 
}catch (FileNotFoundException e){ 
e.printStackTrace(); 
} catch (SAXException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 
}finally{ 
try { 
in.close(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
} 

} 

} 
结果: 
books 
books 
使用DOM获取<book>标签的内容 
package tang.xml.parser; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.w3c.dom.Text; 
import org.xml.sax.SAXException; 

public class MyDocumentLab2 { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 

FileInputStream fis=null; 
Document doc=null; 
DocumentBuilder builder=null; 
DocumentBuilderFactory fac=null; 

fac=DocumentBuilderFactory.newInstance(); 
try { 
builder=fac.newDocumentBuilder(); 
fis=new FileInputStream("/home/soft01/jdbcproject/day05/src/tang/xml/parser/books.xml"); 
doc=builder.parse(fis); 


//StringBuffer sb=new StringBuffer(); 
NodeList nl=doc.getElementsByTagName("book"); 
for(int i=0;i<nl.getLength();i++){ 
Element e=(Element)nl.item(i); 
System.out.println(processElement(e)); 
} 
} catch (ParserConfigurationException e) { 
e.printStackTrace(); 
} catch (FileNotFoundException e) { 
e.printStackTrace(); 
} catch (SAXException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
} 

public static String processElement(Element e){ 
StringBuffer sb=new StringBuffer(); 
sb.append("<"+e.getTagName()); 
NamedNodeMap map=e.getAttributes(); 
for(int i=0;i<map.getLength();i++){ 
Node attr=map.item(i); 
String nodeName=attr.getNodeName(); 
String nodeValue=attr.getNodeValue(); 
sb.append(" "+nodeName+"='"); 
//System.out.println(nodeName+"->"+nodeValue); 
sb.append(nodeValue+"'"); 
} 
sb.append(">"); 
//处理子元素 
NodeList children=e.getChildNodes(); 
for(int i=0;i<children.getLength();i++){ 
Node child=children.item(i); 
String childName=child.getNodeName(); 
String childValue=child.getNodeValue(); 
//System.out.println(childName+"->"+childValue); 

if(child.getNodeType()==Node.ELEMENT_NODE){ 
sb.append(processElement((Element)child));//如果是元素节点则递归调用 
//System.out.println(child.getNodeName()); 
}else if(child.getNodeType()==Node.TEXT_NODE){ 
//sb.append(child.getTextContent());//如果是文本节点则获得文本 
sb.append(((Text)child).getWholeText()); 
// System.out.println(((Text)child).getWholeText()); 
} 

} 
sb.append("</"+e.getTagName()+">"); 
return sb.toString(); 
} 


// private static String processElement(Element e){ 
// StringBuffer sb = new StringBuffer(); 
// sb.append("<"+e.getTagName()); 
// NamedNodeMap attrs = e.getAttributes(); 
// for(int i=0;i<attrs.getLength();i++){ 
//   Node attr = attrs.item(i); 
//   sb.append("  "+attr.getNodeName()+"="); 
//   sb.append(attr.getNodeValue()); 
// } 
// sb.append(">"); 
// NodeList children = e.getChildNodes(); 
// for(int i=0;i<children.getLength();i++){ 
// Node child = children.item(i); 
// if(child.getNodeType()==Node.ELEMENT_NODE){ 
//    sb.append(processElement((Element)child)); 
// }else if(child.getNodeType()==Node.TEXT_NODE){ 
// sb.append(((Text)child).getWholeText()); 
// } 
// } 
// sb.append("</"+e.getTagName()+">"); 
// return sb.toString(); 
// } 
} 
结果: 
<book id='b001'> 
  <name>xiaohua</name> 
  <authuor>tangzhiqiang</authuor> 
  <title>Java</title> 
  <price>21.6</price> 
  <count>100</count> 
</book> 
<book id='b002'> 
  <name>bingb</name> 
  <authuor>tangyi</authuor> 
  <title>HTML</title> 
  <price>10</price> 
  <count>200</count> 
</book>