学习笔记-dom4j和sax

xiaoxiao2021-02-28  24

 SAX篇

SAX是什么:SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。通俗点说就是用来解析xml文件的接口。

SAX特点:SAX是一个用于处理XML事件驱动的“推”模型,SAX解析器不像DOM那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。

SAX的使用:

public class SaxDemo {        public static void main(String[] args) throws ParserConfigurationException, SAXException, Exception { // TODO 自动生成的方法存根 //1.获取它的sax解析器工厂    SAXParserFactory factory =SAXParserFactory.newInstance();     //2.得到解析器    SAXParser parser=factory.newSAXParser();       //3.得到读取器    XMLReader reader = parser.getXMLReader();       //4.给读取器设置事件处理器,从这里可以看出sax是XML事件驱动为模型    reader.setContentHandler(new DefaultHandler() { @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO 自动生成的方法存根 /*ch - 来自 XML 文档的字符 start - 数组中的开始位置 length - 从数组中读取的字符的个数*/  super.characters(ch, start, length); System.out.println(new String(ch,start,length)); } @Override public void startDocument() throws SAXException { // TODO 自动生成的方法存根 super.startDocument(); System.out.println("document start"); } @Override public void endDocument() throws SAXException { // TODO 自动生成的方法存根 super.endDocument(); System.out.println("docunment end"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO 自动生成的方法存根 super.startElement(uri, localName, qName, attributes); //qName为元素限定名,如果限定名不可用则为空 System.out.println("<"+qName+">"); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO 自动生成的方法存根 super.endElement(uri, localName, qName); System.out.println("</"+qName+">"); }            });       //5.读取文件    reader.parse("WebContent/WEB-INF/web.xml"); }

}

注意:sax的功能仅限于读取文件与下面的dom4j不同

DOM4j

DOM4j的定义 DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。

功能以自己目前的学习经验来看,功能就是读写xml文件,读的时候使用SAX技术读取。

DOM4J的几种核心功能将通过代码来实现:

首先,所有的功能都需要读取xml文档,所以将xml文档封装为一个类直接调用即可。

封装document创建类

package dom4j.demo;

/*每次都要用,所有封装起来直接调用*/public class Dom4jCreateDocument {public static Document getDocument(String uri) throws DocumentException {//参数为uri,这是xml文件的地址            SAXReader reader=new SAXReader();            Document document =reader.read(new File(uri)); return document; }

}

其次,增,删,改操作都需要回写xml文件。则将xml文件也封装起来,以供使用:

封装回写类

public class Dom4jwrite {

public static void write(Document document,String uri) throws Exception, FileNotFoundException { //4.回写 /* XMLWriter   writer =new XMLWriter(new OutputStreamWriter(new FileOutputStream("WebContent/WEB-INF/web.xml"), "utf-8"));*/      /*这种方法可以格式化xml且解决字符乱码问题*/ org.dom4j.io.OutputFormat format=org.dom4j.io.OutputFormat.createPrettyPrint();      format.setEncoding("utf-8");     XMLWriter writer =new XMLWriter(new FileOutputStream(uri),format);   writer.write(document);       writer.close(); }}

查操作:

public class Dom4jRead { public static void main(String[] args) throws DocumentException { //1.得到decoument对象 Document document =Dom4jCreateDocument.getDocument("WebContent/WEB-INF/web.xml");        //读取xml文件的信息 //2.读取根元素 Element root =document.getRootElement(); //获取根下的第一个子元素 Element element_1 =root.element("book"); //获取根下的第二个子元素 Element element_2 =root.element("movie"); //获取book下的第一个子元素 Element element_1_1=element_1.element("name"); //获取movie下的第二个子元素 Element element_2_2=element_2.element("auther");   //通过迭代语句获取element所有book节点中的所有字节点 List<Element> elements= element_1.elements(); Iterator<Element> itr=element_1.elementIterator(); while(itr.hasNext()) {   Element list =itr.next();          System.out.println(list.getText()); }   //3.获取元素下的文本信息 String text1=element_1_1.getText(); String text2=element_2_2.getText(); System.out.println(text1); System.out.println(text2); //获取属性的语句 String id=element_1.attributeValue("id"); System.out.println(id); }

}

增操作:

package dom4j.demopublic class Dom4jAdd {public static void main(String[] args) throws DocumentException, Exception { // TODO 自动生成的方法存根     //1.得到document Document document =Dom4jCreateDocument.getDocument("WebContent/WEB-INF/web.xml"); //2.得到要添加到某个元素里面的位置 Element element =document.getRootElement().element("book"); //3.创建子元素     Element date=DocumentHelper.createElement("date");     //增加内容     date.addText("2018/5/2");     //增加属性     date.addAttribute("ch", "man");     //element.add(date);(这个无法指定插入的位置) //创建子元素并且可以选择插入位置        List<Element> list=element.elements();     list.add(1,date); //4.回写      Dom4jwrite.write(document,"WebContent/WEB-INF/web.xml"); }

}

tips增操作有两种方法,第一种通过获取要增加的位置的父节点,然后将要增加的内容设置后好通过add方法存到父节点中,只能放到这个父节点的最后位置

第二种通过获得父节点所有的子节点并存入list集合中,使用list的add(index,name)方法,将其存到指定索引位置。

改操作:

package dom4j.demo;public class Dom4jUpdate { public static void main(String[] args) throws FileNotFoundException, Exception { // TODO 自动生成的方法存根 //获取document Document document =Dom4jCreateDocument.getDocument("WebContent/WEB-INF/web.xml"); //获取根节点 Element  root= document.getRootElement(); //获取date元素 Element element=root.element("book").element("date"); //更新它的数值 element.setText("18/05/02"); //更改属性操作 //获取要更改属性的元素 Element element1=root.element("book"); element1.addAttribute("id", "2");//这里不是使用set方法而是add方法。 //调用回写函数 Dom4jwrite.write(document, "WebContent/WEB-INF/web.xml"); }}

tips改方法很简单,基本就是重新设置需要更改的内容

删操作:

public class Dom4jRemove {

public static void main(String[] args) throws Exception { // TODO 自动生成的方法存根    //1.获取document        Document document =Dom4jCreateDocument.getDocument("WebContent/WEB-INF/web.xml"); /*(1)。删除某个节点必须获得他的父节点才能删除,不能自己删除自己*/ Element element =document.getRootElement().element("book").element("date"); //得到父节点并删除它 element.getParent().remove(element); /*(2)。删除元素的属性操作*/ element.remove(element.attribute("ch"));     //调用回写函数 Dom4jwrite.write(document, "WebContent/WEB-INF/web.xml");

}

}

tips删除某个节点,必须获得他的父节点取删除它,因为自己并不能删除自己

如果想要往xml文件写内容,使用add方法将会很麻烦,幸运的是可以通过字符串来写入xml文件

package dom4j.demo;

public class Dom4jToString {

public static void main(String[] args) throws Exception {

String str=" <movie><name>杨瑞琦</name><auther>余飞</auther></movie> ";//要存入的内容

//得到document Document document =Dom4jCreateDocument.getDocument("WebContent/WEB-INF/web.xml"); //获得根节点 Element element=document.getRootElement(); //将字符串转换为xml文件 Document doc=DocumentHelper.parseText(str); //因为xml文件还有自己的标准结构文件,所以转换后的文件还有标准结构文件 //解决方法:获取这个xml文件的头节点,就是我们需要添加的内容 element.add(doc.getRootElement()); //调用回写函数 Dom4jwrite.write(document, "WebContent/WEB-INF/web.xml"); }

}

tipsxml文件建立好时,会自带标准接口文件

如图,此时获取这个新建的xml文件的头节点,这时候头节点不包括这个标准结构文件。将其存入要存入的xml文件即可

贴下xml文件:

<?xml version="1.0" encoding="utf-8"?><books>   <book id="2">     <name>红楼梦</name>      <date>18/05/02</date>      <auther>曹雪芹</auther>      <price>23</price>   </book>    <movie>     <name>杨瑞琪</name>      <auther>余飞</auther>   </movie> 

</books>

转载请注明原文地址: https://www.6miu.com/read-2629083.html

最新回复(0)