XML解析: 两种:dom解析:一次解析不用重复解析。可以很方便对xml进行增删改查,缺点:每个节点都是对象,dom解析占用内存很大。
sax解析:逐步扫描整个xml文档在扫描过程中对于事件会去调用事件处理器中的对应方法处理事件, sax解析非常快,sax占用内存很少。只能读取数据,不能对xml中的数据进行增删改操作。
sax 解析代码:
package com.itheima;
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler;
public class SaxParseXml { public static void main(String[] args) throws Exception { //使用SAXParserFactory获得创建SAX的工厂 SAXParserFactory saxf= SAXParserFactory.newInstance(); //获取SAX解析工厂得到解析器对象 SAXParser sp = saxf.newSAXParser(); //通过解析器对象得到一个xml的读取器 XMLReader xmlReader = sp.getXMLReader(); //设置读取器的事件处理器 xmlReader.setContentHandler(new MyContentHandler2()); //解析xml文件 xmlReader.parse("book.xml"); } } class MyContentHandler2 extends DefaultHandler{ private boolean flag = false; private int count = 0; @Override public void startElement(String uri,String localName,String qName, Attributes attributes) throws SAXException { if("书名".equals(qName)){ flag = true; count ++; } } @Override public void characters(char[] ch,int start,int length) throws SAXException { if(flag && count == 2) System.out.println(new String(ch,start,length)); }; public void endElement(String uri,String qName) throws SAXException { if("书名".equals(qName)){ flag = false; } } } class MyContentHandler implements ContentHandler{ private boolean flag = false; private int count = 0; @Override public void startDocument() throws SAXException { System.out.println("开始解析book.xml文件"); } @Override public void endDocument() throws SAXException { System.out.println("book.xml解析结束"); } @Override public void startElement(String uri, Attributes atts) throws SAXException { System.out.println(uri+qName); if("书名".equals(qName)){ flag = true; count++; } } @Override public void characters(char[] ch,int length) throws SAXException { if(flag && count == 2){ String bookName = new String(ch,length); System.out.println(bookName); } } @Override public void endElement(String uri,String qName) throws SAXException { System.out.println(uri+qName); if("书名".equals(qName)){ flag = false; } }
@Override public void setDocumentLocator(Locator locator) { } @Override public void startPrefixMapping(String prefix,String uri) throws SAXException { // TODO Auto-generated method stub }
@Override public void endPrefixMapping(String prefix) throws SAXException { // TODO Auto-generated method stub }
@Override public void ignorableWhitespace(char[] ch,int length) throws SAXException { // TODO Auto-generated method stub }
@Override public void processingInstruction(String target,String data) throws SAXException { // TODO Auto-generated method stub }
@Override public void skippedEntity(String name) throws SAXException { // TODO Auto-generated method stub } }
doc解析:
doc解析: 1、查找元素: /** 查找 **/ @Test public void getElement() throws Exception{ //构造sax解析器 SAXReader sax = new SAXReader(); //得到documet对象 Document document = sax.read("book.xml"); //得到root根节点 Element root = document.getRootElement(); System.out.println(root); //获得书名元素 Element el = root.element("书").element("书名"); System.out.println(el.getText()); //遍历所以书名的元素 @SuppressWarnings("unchecked") List<Element> elements = root.elements("书"); Element book2Name = elements.get(1).element("书名"); System.out.println(book2Name.getText()); } /** * 查找属性 * @throws Exception */ @Test public void getAttribution() throws Exception{ //构造Sax解析器 SAXReader reader = new SAXReader(); //获得document对象 Document document = reader.read("book.xml"); //获得根节点 Element note = document.getRootElement(); //获得元素 Element book = note.element("书"); //获得元素的属性 Attribute bookAttr = book.attribute(0); //获得元素的所有属性 @SuppressWarnings({ "unused","unchecked" }) List<Attribute> bookAttrs = book.attributes(); String name = bookAttr.getName(); System.out.println(name+":"+bookAttr.getValue()); } 2、添加元素:注意要把元素写回 xml文件里 public void addElement() throws Exception { //构造sax解析器 SAXReader sax = new SAXReader(); //得到documet对象 Document document = sax.read("book.xml"); //得到root根节点 Element root = document.getRootElement(); //获取父节点 Element shu = root.element("书"); //2.用DocumentHelper的createElement创建特价节点 Element tejia = DocumentHelper.createElement("特价"); tejia.setText("99.9"); //把元素写的父节点上 shu.add(tejia); //把元素写回xml里 //方法一: /*XMLWriter xmlWriter = new XMLWriter(new FileWriter("book.xml"),OutputFormat.createPrettyPrint()); xmlWriter.write(document); xmlWriter.close();*/ //方法二: Writer write = new OutputStreamWriter(new FileOutputStream("book.xml"),"utf-8"); document.write(write); write.flush(); write.close(); } 3、 修改元素 public void updateElement() throws Exception { //构造sax解析器 SAXReader sax = new SAXReader(); //得到documet对象 Document document = sax.read("book.xml"); //得到root根节点 Element root = document.getRootElement(); //得到要修改的元素 Element tejia = root.element("书").element("特价"); tejia.setText("12"); //数据回写 Writer write = new OutputStreamWriter(new FileOutputStream("book.xml"),"utf-8"); document.write(write); write.flush(); write.close(); } 4、 删除元素 public void deleteElement() throws Exception{ //构造解析器 SAXReader sax = new SAXReader(); //获取document对象 Document doc = sax.read("book.xml"); //得到root节点 Element root = doc.getRootElement(); //得到要删除的节点 Element tejia = root.element("书").element("特价"); tejia.getParent().remove(tejia); //写回xml里 Writer writer = new OutputStreamWriter(new FileOutputStream("book.xml"),"utf-8"); doc.write(writer); writer.flush(); writer.close(); }
xpath 1、xpath 的基本语法: a)基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始,那么该路径就表示到一个元素的绝对路径 /AAA b)如果路径以双斜线 // 开头,则表示选择文档中所有满足双斜线//之后规则的元素(无论层级 关系) //BBB c)星号 * 表示选择所有由星号之前的路径所定位的元素 /AAA/CCC/DDD/* d)方块号里的表达式可以进一步的指定元素,其中数字表示元素在选择集里的位置,而last()函 数则表示选择集中的最后一个元素./AAA/BBB[1] and /AAA/BBB[last()] e)选择所有的id属性 //@id //BBB[@id] f)属性的值可以被用来作为选择的准则,normalize-space函数删除了前部和尾部的空格,并且 把连续的空格串替换为一个单一的空格 //BBB[@id='b1'] and //BBB[normalize-space(@name)='bbb'] g)count()函数可以计数所选元素的个数 //*[count(BBB)=2] 选择含有2个BBB子元素的元素 public void learnXpath() throws Exception{ //获取解析器 SAXReader sax = new SAXReader(); //获得document Document doc =sax.read("book.xml"); //获取根元素 Element root = doc.getRootElement(); //匹配要获得的元素 //List<Element> els = root.selectNodes("/书架/书"); //List<Element> els = root.selectNodes("//书"); //List<Element> els = root.selectNodes("//书/*"); //List<Element> els = root.selectNodes("//书/*[2]"); List<Element> els = root.selectNodes("//书[@id]"); System.out.println(els.get(0).getName()); }
book.xml:
<?xml version="1.0" encoding="gb2312"?> <书架> <书> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> </书架> (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|