/*
*xml编程
*解析xml的技术:DOM SAX
*JAXP是sun提交的:javaSE的一部分,DOM解析
*开发步骤:先获取解析器
*获取解析器工厂类
*获取解析器类
*解析xml,返回document对象
*回写
*获取回写的工厂类
*获取回写类
*transform(new DOMSource(document),new StreamResult(path));
=========================================================================================================
*XML约束(schema,看懂)
*schema约束
*schema和DTD的对比
*schema符合XML语法结构,可以克服DTD的局限性(DTD只能引入一个,scheme可以引入多个)
*可以解析schema文档
*schema对名称空间支持得非常好
*schema支持更多的数据类型
*schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制
*schema不能像DTD 一样定义实体,比DTD更复杂,正在取代DTD
*预先定义元素和属性
*schema的后缀名是.xsd
*只能有一个根节点,根节点名称为schema。
*名称空间的概念
*编写万schema文档,起唯一的名称空间
*在编写xml文档时,通过xmlns来引入名称空间
*XML编程
*JAXP的SAX解析
*只能查询,不能crud。
*sax解析
*解析器
*获取解析器的工厂
*获取解析器对象
*解析XML(XML的文件地址,事件处理器(自己编写的事件处理器))
*事件处理器
*自己编写类,继承DefaultHandler,重写三个方法
*startElement()
只要读到开始标签,默认调用该方法。
*characters()
*endElement()
解析器采用SAX方式在解析某个XML文档时,它只需要解析到XML文档的一个组成部分(边读边解析)
都回去调用事件处理器的一个方法,解析器在调用事件处理器的方法时
会把解析到的XML文件内容作为方法的参数传递给事件处理器
事件处理器由程序员编写,程序员通过事件处理器中方法的参数
就可以轻松的得到sax解析器解析到的数据,从而决定如何对数据进行处理
*DOM的解析(必须会,企业用得多)
*先下载DOM4J相应的jar包,导入工程中,才能使用
*把dom4j-1.6.1.jar导入工程
*DOM4J对XPATH的支持
*导包 jaxen-1.1-beta-6.jar
*怎么使用?
*selectNodes() 返回集合
*selectSingleNode() 返回一个node对象
*参数就是xpath的语法
*扩展
*/
练习代码:
sax解析
package com.web.parsexml.sax;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxTest1
{
public static void main(String[] args) throws Exception
{
method2();
}
//解析xml文件的 全部内容
public static void method1() throws Exception
{
//获取SAX解析器工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//获取解析器
SAXParser parser=factory.newSAXParser();
//解析
parser.parse("src/book.xml", new MyHandler());
}
public static void method2() throws Exception
{
//获取SAX解析器工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//获取解析器
SAXParser parser=factory.newSAXParser();
//解析
parser.parse("src/book.xml", new MyHandler2());
}
}
/* 获取xml文档中的所有内容
* 重写三个方法
*/
class MyHandler extends DefaultHandler
{
//只要一解析到文本内容,默认调用该方法
@Override
public void characters(char[] ch, int start, int length) throws SAXException
{
String str=new String(ch,start,length);
System.out.println(str);
}
//只要一解析到结束标签,默认调用该方法,把解析的内容赋值给方法的参数
@Override
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.println("结束标签:"+qName);
}
//只要一解析到开始标签,默认调用该方法,把解析的内容赋值给方法的参数
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
System.out.println("开始标签:"+qName);
}
}
/*
* 获取author标签的文本内容
* */
class MyHandler2 extends DefaultHandler
{
//如果解析到author标签的时候,flag设置为true
private boolean flag=false;
private int count=0;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
if("author".equals(qName))
{
flag=true;
count++;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException
{
if(flag && count==1)
{
String str=new String(ch,start,length);
System.out.println(str);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException
{
//把flag恢复成false
flag=false;
}
}
dom4j解析练习
package com.web.parsexml.dom4j;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jTest1
{
public static void main(String[] args) throws Exception
{
method6();
}
/*
* 获取第二本书的author的文本内容
*/
@SuppressWarnings("unchecked")
public static void method1() throws Exception
{
//获取解析器对象
SAXReader reader=new SAXReader();
//解析xml文档,返回document对象
Document document=reader.read("src/book.xml");
//获取根节点(bookself标签)
Element rootElement=document.getRootElement();
//获取book节点,获取第二本书
List books=rootElement.elements("book");
Element secondBook=books.get(1);
//获取author标签
Element author=secondBook.element("author");
//获取文本内容
System.out.println(author.getText());
}
/*
* 添加子节点,在第二本书下
*
*/
public static void method2() throws Exception
{
//获取解析器对象
SAXReader reader=new SAXReader();
//解析xml文档,返回document对象
Document document=reader.read("src/book.xml");
//获取根节点
Element root=document.getRootElement();
//获取第二本书
Element book2=(Element) root.elements("book").get(1);
//直接在第二本书下面添加子节点并设置文本内容
book2.addElement("cat").setText("i am a cat1");
//回写
//创建漂亮的格式
OutputFormat format=OutputFormat.createPrettyPrint();
//OutputFormat format=OutputFormat.createCompactFormat();
//设置编码
format.setEncoding("utf-8");
//回写类
XMLWriter writer=new XMLWriter(new FileOutputStream("src/book.xml"),format);
//回写的文档对象
writer.write(document);
//关流
writer.close();
}
/*
* 在第二本书的author标签之前添加一个团购价的标签
*
*/
@SuppressWarnings("unchecked")
public static void method3() throws Exception
{
SAXReader reader=new SAXReader();
Document document=reader.read("src/book.xml");
Element root=document.getRootElement();
Element book2=(Element) root.elements("book").get(1);
//获取第二本书下的所有子节点,返回list结合
List lists=book2.elements();
//创建元素对象 DocumentHelper.createElement("cat");
Element addElement=DocumentHelper.createElement("cat");
addElement.setText("猫猫");
//list.add(index,element)
lists.add(addElement);
//回写
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(new FileOutputStream("src/book.xml"),format);
writer.write(document);
writer.close();
}
/*
* 删除子节点
* 删除第二本书下面的price子节点
*/
public static void method4() throws Exception
{
SAXReader reader=new SAXReader();
Document document=reader.read("src/book.xml");
Element root=document.getRootElement();
Element book2=(Element) root.elements("book").get(1);
Element price=book2.element("price");
book2.remove(price);
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(new FileOutputStream("src/book.xml"),format);
writer.write(document);
writer.close();
}
/*
* 修改文本内容
*/
public static void method5() throws Exception
{
SAXReader reader=new SAXReader();
Document document=reader.read("src/book.xml");
Element root=document.getRootElement();
Element book2=(Element) root.elements("book").get(1);
Element price=book2.element("price");
price.setText("111");
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(new FileOutputStream("src/book.xml"),format);
writer.write(document);
writer.close();
}
/*
* 对XPATH的支持
*/
public static void method6() throws Exception
{
SAXReader reader=new SAXReader();
Document document=reader.read("src/book.xml");
List list=document.selectNodes("/bookself/book/author");
Node author2=list.get(1);
System.out.println(author2.getText());
}
}