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>