XML

 
=======xml文件读写========
1、什么是xml?
   Extensible markyup language:
   可扩展性标记语言。
   不是语言,w3c退出的一款全新的数据交互格式。
   -----JSON。
   responseText---responseXML
   只不过特征继承了类似于HMTL标记语言的特征。
   用户可自定义标签--同时还必须给标签样式和属性。
   XHTML---全部是小写。
   通俗的说:xml数据交互文件被广泛的使用在各个地方。
                   不依赖于系统和硬件。
 
2、意义?
   无与伦比的通用性。
   主要功能:用户数据交互。
   java  stu---JSON--XML-->c,c++
   XML:自身提供了解析xml的多种方式。
   用于数据显示:
   用于数据持久化:
   userInfo("1","admin","1")
 
 
 <users>
        <user id="1" name="admin">1</user>
        <user id="2" name="admin1">2</user>
 </users>
 
<users>
     <id>1001</id>
     <name>admin</name>
</users>
 
 
2.什么是?
 
   Iterators:迭代器
   xml  可扩展 标记语言
 
 
3、怎么用?
   1、dom解析---内存开销大,支持回溯。
 
   2、sax解析---不支持回溯,性能也不是很好。
      p...
 
   3、dom4j解析---好用,免费,语法同一,简单。
                  综合性能释放最好的。
 
 
public class test01{
     public static void main(String[] args){
          /**
*解析xml
*/
          try{
             File src = new File("c:\x\users.xml");
             //a.创建SAXReader
             SAXReander reader = new SAXReader();
             //b.得到document对象(读取文件)
             //reader.setEncoding("UTF-8");
             Document doc= reader.read(src);
             //c.得到根元素(得到xml文件下的根目录)
             Element root =doc.getRootElenment();
             //d.得到包含子元素的集合
              List<Element>eles =root.elements();
             //e.遍历集合,得到每个元素
             for(Element element:eles){
                  // Attribute attrname = ele.attribute("name");
                  //String vauename = attrname.getValue();
                  // System.out.println(valuename);
                  System.out.println(element.attributeValue("id"));
                  System.out.println(element.attributeValue("name"));
                  System.out.println(element.getText());    
               }
                }catch(Elenment e){
               e.printStackTrace();
          }
     }
}
 
 
public class test02{
     public static void main(String[] args){
          /**
*写入xml
*/
          try{
               //a.创建document文档
               Document doc  = DocumentHelper.crearteDocument();
               //b.创建根元素
               Element root = doc.addElement("stus");
               //c.为根元素添加子元素(属性、内容)
 
          // Element stu1= root.addElement("stus")
          // .addAttribute("id","xwz");
          // .addAttribute("name","小丸子");
          // .addAttribute("喜欢爷爷");
 
               Element stu1= root.addElement("stus");
               stu1.addAttribute("id","xwz");
               stu1.addAttribute("name","小丸子");
               stu1.addAttribute("喜欢爷爷");
 
               Element stu2= root.addElement("stus");
               stu2.addAttribute("id","xy");
               stu2.addAttribute("name","小玉");
               stu2.addAttribute("喜欢花轮");
 
               //d.利用xmlwriter将doc写入磁盘
               OutputStream out = new FileOutStream("c:\x\stus.xml");
               //e.创建文档的储存格式 
               OutputFormat format = OutputFormat.createPrettyPrint();
               //f.设置保存的编码集
               format.setEnconding("GBK");
               XMLwriter writer = new XMLWriter(out,format);
               //g.写入
               wirter.writer(doc);
               wirter.flush();
               wirter.close();  
             }catch(Elenment e){
               e.printStackTrace();
          }    
     }
}
 
 
xml的增删改查
 
pulic class XMLParse{
     private static File file=new File("C:\aa\student.xml");
/**
xml数据的增加
*/
public  void add(Student stu){
     //读取文档
     Document doc = new ParseXML().reader(file);
     Element root = doc.getRootElement();
 
     Element stu1 = root.addElement("student");
     stu1.addAttribute("id",stu.getId());
     stu2.addAttribute("name",stu.getName()).
 
     stu1.setText(stu.getPwd());
 
     new ParseXML().xmlwriter(file,doc);
}
 
 
/**
xml数据的修改
*/
public  void upd(Student stu){
 //读取文档
Document doc = new ParseXML().reader(file);
Element root = doc.getRootElement();
 
List<Element> element = root.elements();
for(int i = 0;i<element.size();i++){
     if(elememts.get(i).attributeValue("id").equals(stu.getId())){
         elememts.get(i).attribute("name").setValue("徐晃");
     }
}
     new ParseXML().xmlwriter(file,doc);
}
 
/**
xml数据的删除
*/
public  void del(Student stu){
 //读取文档
Document doc = new ParseXML().reader(file);
Element root = doc.getRootElement();
 
List<Element> element = root.elements();
for(int i = 0;i<element.size();i++){
     if(elememts.get(i).attributeValue("id").equals(stu.getId())){
         elememts.remove(i);
     }
}
     new ParseXML().xmlwriter(file,doc);
}
 
 
/**
*测试
*/
public static void main(String[] args){
     Student stu = new Student("1001","索尼");
     add(stu);
     upd(stu);
}
}
 
 
/**
*创建工具类
*/
 
public class ParseXML{
 
     //读取数据
     public Document reader(File file){
          InputStream is = null;
          Document doc = null;
          try{
              is = new FileInputStream(file);
              SAZReader reader  new SAXReader();
              doc = new reader.read(is);
          }catch(FileNotFoundException e){
              e.printStackTrace(); 
          }
          return doc;
     }
 
     //保存
     public void xmlwriter(File file,Document doc){
                  OutputStream out=null;
                OutoutFormat format=null;
                XMLwriter writer=null;
               out = new FileOutStream("c:\x\stus.xml");
               //e.创建文档的储存格式 
               format = OutputFormat.createPrettyPrint();
               //e.设置保存的编码集
               format.setEnconding("GBK");
               try{               
      writer = new XMLWriter(out,format);
}catch(FileNotFoundException e){
      e.printStackTrace(); 
}
               //f.写入
                try{  
            wirter.writer(doc);
            wirter.flush();
            wirter.close();  
            out.close();
             }catch(Elenment e){
               e.printStackTrace();
             } 
           
    }
}
 
 
 

DOM和SAX解析的区别
 
 
1、操作有区别: DOM将所有文件读取到内存中形成DOM树,如果文件量过大,则无法使用
 
        SAX顺序读入所需要的文件内容,不会一次性全部读取,不受文件大小的限制
 
2 访问限制有区别: DOM树在内存中形成,可以随意存放或读取文件树的任何部分,没有次数限制
 
           SAX由于采用部分读取,只能对文件按顺序从头到尾读取XML文件内容,但不能修改
 
3 修改有区别: DOM可以任意修改文件树
 
        SAX只能读取XML文件内容,但不能修改
 
4 复杂度有区别:DOM 易于理解,易于开发
 
        SAX开发上比较复杂,需要用户自定义事件处理器
 
5 对象模型有区别: DOM 系统为使用者自动建立DOM树,XML对象模型由系统提供
 
           SAX 对开发人员更加灵活,可以用SAX建立自己的XML对象模型
 
 
DOM 简介:
    DOM 对于 XML 的处理方式就是把整个 XML 读到内存中形成一棵树状结构,
 
    然后用各种方法对这棵数进行遍历、插入、删除、修剪等操作。因为 DOM
 
    是 W3C 的正式标准,所有的语言都有支持 DOM 的解析器,包括 Java、C/C++、Perl、
 
    JavaScript 等等。DOM 的优点是信息量丰富(全部都在内存中),而且可以随机访问,
 
    尤其是在处理前后相互关联的元素时非常方便。DOM 的缺点是 XML 应用程序在处理 XML
 
    之前必须先由 XML 解析器把整个 XML 读进内存并生成树状结构,如果 XML 非常大,
 
    例如 10M,解析的过程是非常慢的。如果再加上 XSLT 转换(这是一种必须要使用 DOM 的操作)
 
    这类同样耗费资源的操作,可能会耗尽系统的内存资源。所以标准 DOM 只适合于中小型 XML 的处理。
 
 
SAX 简介:
    为了更好地解决大型 XML 处理的问题,Java 开发人员发明了 SAX。SAX 采用事件驱动的方式来处理 XML,它
 
    的处理方式是:为每一个元素、属性、内容(这些都认为是事件)定义一个回调方法,这个回调方法由应用程
 
    序提供。解析器以数据流的方式读入 XML,当遇到某个元素、属性、内容时就调用相应的回调方法。SAX 的优
 
    点是处理效率高,适合处理大型 XML。缺点是 SAX 对 XML 是只读的,不能够对 XML 进行写操作,而且 SAX
 
    处理 XML 中前后相互关联的元素时也没有 DOM 方便,因为应用程序必须自己保留以前事件的状态信息。但是
 
    SAX 还是取得了巨大的成功,后来 SAX 还被移植到了 C++ 等语言中。
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/nin-w/p/5907477.html