三、XML解析技术

1、 js、java、c、c++等这些语言需要对xml文件进行crud操作?

1) xml作为数据传递,需要解析
2) xml作为配置文件,需要读取
3) xml作为小型数据库,crud操作;
备注:这些语言对xml文件操作的时候有一套规范;w3c组织为了大家操作xml方便,就定义了一套规范(api/函数)
2、XML解析器以及各自优缺点:

dom解析器、sax解析器、dom4j
dom (Document Object Mode 即文档对象模型):是W3C组织推荐的定义的访问和处理XML文档的标准方式;
sax(Simple API for XML):不是官方标准,但是他是XML社区事实上的标准,几乎所有的XML解析器都支持它;
备注:xml解析器实际上就是一套API(Application Program Interface)

1) 在使用DOM解析XML文档时,需要读取整个XML文档,在内存中构建代表整个DOM树的Document对象,从而再对XML进行操作。
在此情况下,如果xMl文档特别大,就会消耗计算机大量的内存,严重情况下可能还会导致内存溢出。

2)sax技术可以在不加载xml文件全部时,就可以解析xml文档。sax技术里面两个重要的对象:sax解析器;事件处理器(继承DefaultHandle类)。sax是一种推式的机制,你创建一个sax解析器,解析器在发现xml文档中的内容时就告诉你(把事件推给你),如何处理这些内容由程序员自己决定。sax技术缺陷是:它不能对我们的xml文件进行修改、添加、删除,这也是他的缺点,也是说只能使用sax技术进行解析和读取,
在sax的程序中,五个最常用的sax事件
startDocument()--->告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档
endDocument()--->告诉你解析器发现了文档尾
startElement()--->告诉你解析器发现了一个开始标签,该事件告诉你元素的名称,该元素的所有的属性名和值
character()--->告诉你解析器发现了一些文本,将得到一个字符数组,该数组的偏移量和一个长度变量,有三个变量你可以得到解析器发现的文本
endElement()--->告诉你解析器发现了一个结束标签,该事件告诉你元素的名称

3)为什么有dom4j?
dom缺点:比较耗费内存;sax缺点:只能对xml进行读取,但是不能去修改、添加、删除
dom4j:即可以提高效率,同时也可以进行crud。特别说明:因为dom4j不是sun公司的产品,所以我们开发dom4j需要引入jar 包

 

|DOM解析技术实例|

Class.xml文件内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><班级>
 <学生 sex="女" 学号="01">
  <名字>宋江</名字>
  <年龄>29</年龄>
  <爱好>打球</爱好>
 </学生>
 <学生 sex="男=女" 学号="02">
  <名字>丹丹</名字>
  <年龄>27</年龄>
  <爱好>睡觉</爱好>
 </学生>
 <学生 sex="女" 学号="03">
  <名字 类型="花心">五花</名字>
  <年龄>30</年龄>
  <爱好>睡觉</爱好>
 </学生>
</班级>

DomXml1.java 文件中内容

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.soap.Node;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomXml1 {
 public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {
  //创建DOM解析器工厂对象
  DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
  //创建DOM解析器对象
  DocumentBuilder dBuilder=dbf.newDocumentBuilder();
  //调用DOM解析器对象的parse()方法解析Xml文档,得到代表整个文档的
  Document document= dBuilder.parse("src/XML用法/Classes.xml");
  //执行完上述的代码就会把内存中的document拿到,那么document下面的任何一个元素或者说是任何一个节点都会被拿到
  read(document);
/*  add(document);
  update(document);
  del_ele(document);*/
  del_att(document);
  
 } 
 //读取节点、属性
 public static void read(Document doc){
  NodeList nodeList= doc.getElementsByTagName("学生");
  System.out.println("学生的信息的个数是"+nodeList.getLength());
  //取出 第一个学生
  Element stu= (Element) nodeList.item(0);
  System.out.println("第一个学生的性别是"+stu.getAttribute("sex"));
  Element name=(Element) doc.getElementsByTagName("名字").item(0);
  System.out.println("第一个学生的名字是"+name.getTextContent());
 }
 //遍历节点
 public static void list(Node node){
  if(node.getNodeType()==node.ELEMENT_NODE){
   System.out.println(node.getNodeName());
  }
  //取出node的子节点
  NodeList nodeList=node.getChildNodes();
  for(int i=0;i<nodeList.getLength();i++){
   //再去显示
   Node n=(Node) nodeList.item(0);
   list(n);
  }
  
 }
 //增加节点、属性
 public  static void add(Document doc) throws TransformerException{
  Element newStu=doc.createElement("学生");
  newStu.setAttribute("学号", "03");
  newStu.setAttribute("sex", "女");
  Element new_Stu_age=doc.createElement("年龄");
  new_Stu_age.setTextContent("30");
  Element new_Stu_name=doc.createElement("名字");
  new_Stu_name.setTextContent("马六");
  Element new_stu_love=doc.createElement("爱好");
  new_stu_love.setTextContent("睡觉");
  newStu.appendChild(new_Stu_name);
  newStu.appendChild(new_Stu_age);
  newStu.appendChild(new_stu_love);
  
  //把新的学生添加到根节点
  doc.getDocumentElement().appendChild(newStu);
  
  TransformerFactory  tff=TransformerFactory.newInstance();
  //得到一个转化器工厂
  Transformer tf= tff.newTransformer();
  tf.transform(new DOMSource(doc) , new StreamResult("src/XML用法/Classes.xml"));
 }
 //更新节点、属性
 //(把第三个学生的名称改为宋江,并且将其sex属性更改为男)
 public static void update(Document doc) throws TransformerException{
  Element  node=(Element) doc.getElementsByTagName("学生").item(2);
  Element node_name=(Element) node.getElementsByTagName("名字").item(0);
  node_name.setTextContent("五花");
  node_name.setAttribute("类型","花心");
  TransformerFactory tff=TransformerFactory.newInstance();
  Transformer tf=tff.newTransformer();
  tf.transform(new DOMSource(doc),new StreamResult("src/XML用法/Classes.xml"));
  
 }
 //删除元素
 public static void del_ele(Document doc) throws TransformerException{
 Element nodElement= (Element) doc.getElementsByTagName("学生").item(3);
 nodElement.getParentNode().removeChild(nodElement);
 TransformerFactory tff=TransformerFactory.newInstance();
 Transformer tf=tff.newTransformer();
 tf.transform(new DOMSource(doc), new StreamResult("src/XML用法/Classes.xml"));
 
 }

 //删除属性
 public static void del_att(Document doc) throws TransformerException{
  Element stu=(Element) doc.getElementsByTagName("名字").item(0);
  stu.removeAttribute("sex");
  TransformerFactory tff=TransformerFactory.newInstance();
  Transformer tf=tff.newTransformer();
  tf.transform(new DOMSource(doc), new StreamResult("src/XML用法/Classes.xml"));
 }
}

|sax解析器技术:示例|

|dom4j解析技术:实例|

MyClass3.xm文件中的内容

<?xml version="1.0" encoding="UTF-8"?>
<班级>
 <学生>
  <名字 别名="小黑" sex="女">宋江</名字>
  <年龄>20</年龄>
  <介绍>很努力</介绍>
 </学生>
 <学生 别名="小白" sex="女">
  <名字>辉辉</名字>
  <年龄>21</年龄>
  <介绍>很优秀</介绍>
 </学生>
 <学生/><学生/><学生 sex="男">
  <名字>小明</名字>
  <年龄>30</年龄>
  <介绍>这是一个好孩子</介绍>
 </学生>
 <学生>
  <名字>东东</名字>
  <年龄/>
  <介绍/>
 </学生>
</班级>

MyClass3.java文件中的内容

 

import java.awt.List;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.sql.SQLException;
import java.util.Iterator;

 

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

 

public class MyClass03 {
 public static void main(String[] args) throws DocumentException, IOException {
  //得到解析器
  SAXReader saxReader=new SAXReader();
  //执行解析那个文件
  Document document=saxReader.read(new File("src/XML用法/MyClass3.xml"));
//  list(document.getRootElement());
//  read(document);
//  add(document);
//  del(document);
//  delAtt(document);
//  update(document);//格式化异常
  addByIndex(document);
 }
 //针对整个xml进行遍历
 public static void list(org.dom4j.Element element){
  System.out.println(element.getName()+":"+element.getTextTrim());
  Iterator it=element.elementIterator();
  while(it.hasNext()){
   Element e= (Element) it.next();
   list(e);
  }
 }
 //指定读取某个元素
 public static void read(Document document){
  Element rootElement=document.getRootElement();
  Element stuElement=(Element) rootElement.elements("学生").get(0);
  //取出第一个学生下面的名字
  String name_text=stuElement.element("名字").getText();
  System.out.println(name_text);
  String name=stuElement.element("名字").getName();
  System.out.println(name+":"+name_text+"  别名:"+stuElement.element("名字").attributeValue("别名"));
 }
 //添加元素
 public static void add(Document document) throws IOException{
  Element newStu=DocumentHelper.createElement("学生");
  Element newStu_name=DocumentHelper.createElement("名字");
  newStu_name.setText("东东");
  Element newStu_age=DocumentHelper.createElement("年龄");
  Element newStu_inf=DocumentHelper.createElement("介绍");
  //把三个子节点加到newStu下:
  newStu.add(newStu_name);
  newStu.add(newStu_age);
  newStu.add(newStu_inf);
  //再把newStu节点添加到根元素下面:
  document.getRootElement().add(newStu);
  //直接输出会导致中文乱码,要进行输出格式的设置
  OutputFormat opfFormat= OutputFormat.createPrettyPrint();
  opfFormat.setEncoding("UTF-8");
  XMLWriter writer=new XMLWriter(new FileOutputStream(new File("src/XML用法/MyClass3.xml"))) ;
  writer.write(document);
  writer.close();
  
 }
 //删除第一个元素
 public static void del(Document document) throws IOException{
  Element stu1=document.getRootElement().element("学生");
  stu1.getParent().remove(stu1);
  OutputFormat output=OutputFormat.createPrettyPrint();
  output.setEncoding("UTF-8");
  XMLWriter writer=new XMLWriter(new FileOutputStream(new File("src/XML用法/MyClass3.xml")));
  writer.write(document);
  writer.close();
  
 }
 //删除属性
 public static void delAtt(Document document) throws IOException{
  //先找到该元素
  Element stu=document.getRootElement().element("学生").element("名字");
  //删除属性
  stu.remove(stu.attribute("别名"));
  OutputFormat output=OutputFormat.createPrettyPrint();
  output.setEncoding("UTF-8");
  XMLWriter writer=new XMLWriter(new FileOutputStream(new File("src/XML用法/MyClass3.xml")));
  writer.write(document);
  writer.close();
  
 }
 //更新元素:所有学生的年龄增加3岁,并且把别名换成傻样
 public static void update(Document document) throws IOException{
  java.util.List<Element> stu=document.getRootElement().elements("学生");
  for(Element element:stu){
   Element ele_age=element.element("年龄");
   System.out.println(((Integer.parseInt(ele_age.getText())+3)+""));
//   ele_age.setText();
   
    
   Element name= element.element("名字");
   name.addAttribute("小名", "helloworld");
   
  }
  OutputFormat output=OutputFormat.createPrettyPrint();
  output.setEncoding("UTF-8");
  XMLWriter writer=new XMLWriter(new FileOutputStream(new File("src/XML用法/MyClass3.xml")));
  writer.write(document);
  writer.close();
  
  
 }
 
 //添加一个元素到指定的位置 在名字为辉辉的位置
 public static void addByIndex(Document document) throws IOException{
  Element newStu=DocumentHelper.createElement("学生");
  Element newStu_name=DocumentHelper.createElement("名字");
  //得到学生的List
  java.util.List<Element> allList= document.getRootElement().elements("学生");
  for(int i=0;i<allList.size();i++){
   Element name=allList.get(i).element("名字");
   if(name.getText().equals("辉辉")){
    allList.add(i+1, newStu);
    break;
   }
  }
  //更新xml文件
  OutputFormat output=OutputFormat.createPrettyPrint();
  output.setEncoding("utf-8");
  XMLWriter writer=new XMLWriter(
    new FileOutputStream(new File("src/XML用法/MyClass3.xml"))
  );
  writer.write(document);
  writer.close();
 }
}

 

posted @ 2016-12-31 17:37  爱笑的berg  阅读(127)  评论(0)    收藏  举报