学习笔记-dom4j和sax

 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创建类

扫描二维码关注公众号,回复: 150956 查看本文章

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> ";//要存入的内容

//得到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>


猜你喜欢

转载自blog.csdn.net/sunmeok/article/details/80173830