笔记--解析xml

/*
*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());
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值