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.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"); }}
tips:xml文件建立好时,会自带标准接口文件
如图,此时获取这个新建的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>
