sax查询和dom4j增删改查操作

sax查询操作

package cn.zzuli.sax;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
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 check_sax {

	
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
		SAXParser saxParser = saxParserFactory.newSAXParser();
		saxParser.parse("src/sax_xml.xml", new mydefaulthandler());

	}
}
class mydefaulthandler extends DefaultHandler{

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		
		System.out.println("<"+qName+">");
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		
		System.out.println("</"+qName+">");
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		System.out.println(new String(ch,start,length));
	}
	
}
  1. 首先用new Instance()方法创建SAXParserFactory的对象
  2. 利用sax解析工厂创建sax解析器,即SAXParser
  3. 解析xml文件,注意sax解析文件是逐句逐句的解析,而且解析方向是由上向下的,每解析到标签开头会调用startElement()方法,解析到text文本部分会调用character()方法,解析到标签结束处会调用endElement()方法。
  4. parser(f,dh)方法中需要传入两个参数,一个是文件路径f,另一个是事件处理器,为了观察sax的解析过程这边直接继承重写Defaulthandler类。

dom4j查询操作

//查询操作
	public static void Querydom() throws DocumentException{
		//saxreader
	 SAXReader saxReader = new SAXReader();
	 Document document = saxReader.read("src/sax_xml.xml");
	 Element root = document.getRootElement();
	 List<Element> list = root.elements("person");
	 for(Element ele:list){
		 Element name1 = ele.element("name");
		 String s = name1.getText();
		 System.out.println(s);
	 }
	}
  • 导入dom4j的jar包,得到saxReader对象
  • 获取document对象,通过操作document下的方法进行查询具体标签
  • 这里需要注意的是,element(arg)方法,他只能一级一级进行访问,例如
<?xml version="1.0" encoding="UTF-8"?>

<root> 
  <person> 
    <name>zhaoliu</name>  
    <age>20</age>  
    <sex>nv</sex>  
    <school>zzuli</school>
  </person>  
  <person> 
    <name>lisi</name>  
    <age>25</age>  
    <sex>nan</sex> 
  </person> 
</root>

获取name对象只能通过person.element(“name”)方法,而不能越级访问。如果root.element(“name”),编译器会报指针异常。

  • 由于获取document和回写操作一致,我们向上提取创建一个工具类dom4jUtils
package cn.zzuli.domUtils;



import java.io.FileOutputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class dom4jUtils {
	public static final String path = "src/sax_xml.xml";
	public static void main(String[] args) {
		
	}
	
	
	//返回document对象
	public static Document getDocument(String str) throws DocumentException{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read(str);
		return document;
	}
	
	public static void xmlwrite(String str,Document document){
		//回写操作
				try{
					OutputFormat format = OutputFormat.createPrettyPrint();
					XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(str),format);
					xmlWriter.write(document);
					xmlWriter.close();
				}catch(Exception e) {
					e.printStackTrace();
				}
	}
}

指定位置添加标签

//指定地点添加元素
		public static void addsch() throws DocumentException{
			Document document = dom4jUtils.getDocument(dom4jUtils.path);
			
			Element root = document.getRootElement();
		
			List<Element> list = root.elements("person");
			
			for(Element ele:list){
				Element element = ele.element("name");
			
				if(element.getText().equals("zhaoliu")){
					Element school = ele.addElement("school");
					school.setText("zzuli");
				}
				dom4jUtils.xmlwrite(dom4jUtils.path, document);
			}
			
		}
  • 因为root下面有两个person标签,这时候如果直接去获取person标签是取不到的,因此要用elements(arg)方法返回list对象,此时对person中的一些标签值进行对比,进而找到自己想要的person。
  • 如上,我用的getText获取第一个person的名字与字符字段进行对比,返回true的话就确定这是我要的person,然后进行添加操作。

改变标签的值

public static void modifydom() throws DocumentException{
		Document document = dom4jUtils.getDocument(dom4jUtils.path);
		
		Element root = document.getRootElement();
	
		Element person = root.element("person");
		
		Element name = person.element("name");
		
		name.setText("zhaoliu");
		dom4jUtils.xmlwrite(dom4jUtils.path, document);
		
	}

删除操作

//删除操作
	public static void deldom() throws DocumentException{
		Document document = dom4jUtils.getDocument(dom4jUtils.path);
		
		Element root = document.getRootElement();
		System.out.println(root.getName());
		Element person = root.element("person");
		System.out.println(person.getName());
		Element adress = person.element("adress");
		person.remove(adress);

		dom4jUtils.xmlwrite(dom4jUtils.path, document);
		
	}

添加操作

//添加操作
	public static void adddom() throws DocumentException{
		
		Document document = dom4jUtils.getDocument(dom4jUtils.path);
		
		Element root = document.getRootElement();
		Element person = root.element("person");
		Element adress = person.addElement("adress");
		adress.setText("河南省郑州市");
		dom4jUtils.xmlwrite(dom4jUtils.path, document);
		
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值