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));
}
}
- 首先用new Instance()方法创建SAXParserFactory的对象
- 利用sax解析工厂创建sax解析器,即SAXParser
- 解析xml文件,注意sax解析文件是逐句逐句的解析,而且解析方向是由上向下的,每解析到标签开头会调用startElement()方法,解析到text文本部分会调用character()方法,解析到标签结束处会调用endElement()方法。
- 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);
}