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.demo
public 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> ";//要存入的内容
//得到documentDocument 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>