XML基础+Java解析XML +几种解析方式的性能比较

您所在的位置:网站首页 java程序是用来解析什么文件的 XML基础+Java解析XML +几种解析方式的性能比较

XML基础+Java解析XML +几种解析方式的性能比较

2023-05-15 17:54| 来源: 网络整理| 查看: 265

XML基础+Java解析XML 一:XML基础 XML是什么:

可扩展的标记语言

XML能干什么:

描述数据、存储数据、传输(交换)数据。

XML与HTML区别:

目的不一样

XML 被设计用来描述数据,其焦点是数据的内容。

HTML 被设计用来展示数据,其焦点是数据的外观。

HTML可以不关闭标签(即标签可以不成对出现),但XML必须关闭标签(即标签必须成对出现)。

HTML中的标签标识文本如何展示,而XML中的标签标识文本是什么含义(什么类型的文本)。

XML文档节点类型

u     文档(document)

u     元素(element)

u     属性(attribute)

u     文本(PCDATA--parsed character data)

u     注释(comment)

u     DOCTYPE :主要验证文档内容的正确性

u     实体(ENTITIES)

u     CDATA(character data)

XML语法

1、声明:

2、根节点:必须有一个根节点

3、标签:标签必须有结束且区分大小写,标签必须顺序嵌套

4、属性:必须引号引起值

5、空格会被保留,HTML空格最多保留一个

6、命名规则:命名必须见名知意

     a)名字可包含字母、数字以及其他的字符 

     b)名字不能以数字或者标点符号开始

     c)名字不能以字符“xml”(或者XML、Xml)开始

7、名字不能包含空格

8、 不应在 XML 元素名称中使用 ":" ,这是由于它用于命名空间(namespaces)的保留字。

9、标签优先于属性。

10、XML 命名空间可提供避免元素命名冲突的方法。

11、CDATA:字符数据, ,字符数据不进行转义

12、实体:&实体;

Xml约束 XML DTD 约束

DTD(DocType Definition 文档类型定义)的作用是定义 XML 文档的合法构建模块。

它使用一系列的合法元素来定义文档结构。用于约定XML格式。

1、DTD引用方式   1、内部

例如:

]>

        Java就业培训教程

        张孝祥

        39.00元

...

  2、外部私有的 SYSTEM   一般是我们自己定义的,可能只是一个公司内部使用

例如:

   

      java编程思想

      Brnee

      80

   

  3、外部公有的  PUBLIC   一般是一些标准,可能非常多的人用

 

首先根据“命名空间”去问环境要相应的dtd文件,如果有,直接提供,如果没有再根据dtd文件位置找。

 

      例如:

2、例子:         ]>   Tove   Jani   Reminder   Don't forget me this weekend 3、参考文档:

点击打开链接

XML Schema 约束

XML Schema 是基于 XML 的 DTD 替代者。XML Schema 描述 XML 文档的结构。XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

DTD不是通过XML语法定义文档结构, 不能定义数据类型和限制Schema通过XML语法定义文档结构,可以定义数据类型和限制

约定XML格式

定义可出现在文档中的元素 定义可出现在文档中的属性 定义哪个元素是子元素 定义子元素的次序 定义子元素的数目 定义元素是否为空,或者是否可包含文本 定义元素和属性的数据类型 定义元素和属性的默认值以及固定值 1、为何使用Schema

XML Schema 是 DTD 的继任者

XML Schema 可针对未来的需求进行扩展 XML Schema 更完善,功能更强大 XML Schema 基于 XML 编写 XML Schema 支持数据类型和限制 XML Schema 支持命名空间 2、Schema引用方式

如何找Schema,和DTD一样,首先根据命名空间问环境要,找不到再根据Schema位置找。

3、例子:

 

[html] view plain copy                                                                                                                                                                                                                                                                                                                                                                                               

 

 

4、参考文档:

点击打开链接

二、Java解析XML

l XML解析方式分为两种:dom和sax

•    dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。

•    sax: (Simple API for XML) 不是官方标准,但它是XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

l XML解析器

•    Crimson、Xerces 、Aelfred2

l XML解析开发包

•    Jaxp、Jdom、dom4j

1、DOM解析

DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。

DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。

DOM是拉模型,在遍历文档时,会把感兴趣的部分从读取器中拉出,不需要引发事件,允许我们选择性地处理节点。这大大提高了灵活性,以及整体效率。

JAXP(DOM解析)

l  JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成

l  在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX的解析器对象。

1、java代码显例:

 

[html] view plain copy                     张三           广州           100                         李四           大连           97                                小毛           广州           23.0                             80.0           广州           钟源茂         [java] view plain copy   package com.zhong.xml.parse;      import java.io.BufferedReader;   import java.io.File;   import java.io.IOException;   import java.io.InputStreamReader;      import javax.xml.parsers.DocumentBuilder;   import javax.xml.parsers.DocumentBuilderFactory;   import javax.xml.parsers.ParserConfigurationException;   import javax.xml.transform.Transformer;   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.Node;   import org.w3c.dom.NodeList;   import org.xml.sax.SAXException;      public class JaxpDemo {          /**       * @param args       * @throws IOException        */       public static void main(String[] args) throws Exception {                         System.out.print("添加用户:(a)  ");           System.out.print("删除用户:(b)  ");           System.out.println("查询成绩:(c)");           System.out.print("请输入操作类型:");           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));           String type = br.readLine();                      if("a".equals(type)){                              //添加用户               Student student = new Student();               System.out.print("请输入学生姓名:");               String name = br.readLine();               student.setName(name);               System.out.print("请输入学生准考证号:");               String examid = br.readLine();               student.setExamid(examid);               System.out.print("请输入学生身份证号:");               String idcart = br.readLine();               student.setIdcart(idcart);               System.out.print("请输入学生所在地:");               String location = br.readLine();               student.setLocation(location);               System.out.print("请输入学生成绩:");               String grade = br.readLine();               student.setGrade(grade);                              add(student);               System.out.println("------添加数据成功------");           }else if("b".equals(type)){               //删除用户               System.out.print("请输入删除的学生姓名:");               String name = br.readLine();               delete(name);               System.out.println("------已成功删除学生信息------");                          }else if("c".equals(type)){               //查询成绩               System.out.print("请输入查询的学生准考证号:");               String examid = br.readLine();               Student student = find(examid);               System.out.println("您查询的学生信息为:");               System.out.println(student);                          }else{               System.out.println("对不起,您的操作有误!!");           }       }          private static Student find(String examid) throws Exception {              Document document = getDocument();           NodeList list = document.getElementsByTagName("student");           for(int i=0;i                     张三           广州           100                         李四           大连           97                                小毛           广州           23.0                             80.0           广州           钟源茂        

 

[java] view plain copy   package cn.zhong.dao;      import java.io.BufferedReader;   import java.io.File;   import java.io.FileOutputStream;   import java.io.IOException;   import java.io.InputStreamReader;   import java.util.Iterator;   import java.util.List;      import javax.xml.parsers.ParserConfigurationException;      import org.dom4j.Document;   import org.dom4j.DocumentException;   import org.dom4j.Element;   import org.dom4j.io.SAXReader;   import org.dom4j.io.XMLWriter;   import org.junit.Test;   import org.xml.sax.SAXException;      public class Dom4j_demo {          public static void main(String[] args) throws IOException,               ParserConfigurationException, SAXException, DocumentException {           System.out.println("添加学生 (a) 查找学生 (b) 删除学生 (c)");           System.out.print("请输入想要的操作:");              BufferedReader buf = new BufferedReader(                   new InputStreamReader(System.in));           String value = buf.readLine();           if (value.equalsIgnoreCase("a")) {               try {                   System.out.print("请输入学生姓名:");                   String name = buf.readLine();                      System.out.print("请输入学生准考证号:");                   String examid = buf.readLine();                      System.out.print("请输入学生身份证号:");                   String idcard = buf.readLine();                      System.out.print("请输入学生所在地:");                   String location = buf.readLine();                      System.out.print("请输入学生成绩:");                   String grade = buf.readLine();                      Student student = new Student();                   student.setExamid(examid);                   student.setGrade(Double.parseDouble(grade));                   student.setIdcard(idcard);                   student.setLocation(location);                   student.setName(name);                      // StudentDaoByJaxp sd = new StudentDaoByJaxp();                   // sd.appUser(student);                   Dom4j_demo dj = new Dom4j_demo();                   dj.appUser(student);                      System.out.println("恭喜你,添加成功");                   dj.appUser(student);                  } catch (IOException e) {                   System.out.println("输入有误,添加失败,请重新输入");               }              } else if (value.equalsIgnoreCase("b")) {               System.out.print("请输入想查找的学生准考证号:");               String examid = buf.readLine();               Dom4j_demo dj = new Dom4j_demo();               Student s = dj.selectUser(examid);                  if (s != null) {                   System.out.println("你要查找的学生的信息如下:");                   System.out.println("姓名:" + s.getName());                   System.out.println("准考证号:" + s.getExamid());                   System.out.println("身份证号:" + s.getIdcard());                   System.out.println("所在地:" + s.getLocation());                   System.out.println("成绩:" + s.getGrade());               } else {                   System.out.println("你所查找的学生不存在");               }              } else if (value.equalsIgnoreCase("c")) {                  try {                   System.out.print("请输入想删除的学生姓名:");                   String name = buf.readLine();                   Dom4j_demo dj = new Dom4j_demo();                   dj.deleteUser(name);                      System.out.println("恭喜你,删除成功");               } catch (Exception e) {                   System.out.println("删除失败,请重新来过");               }           } else {               System.out.println("请输入正确的指令");           }          }          // 增加学生       @Test       public void appUser(Student student) {           try {               Document document = getDocument();               Element rootNode = document.getRootElement();                  Element sNode = rootNode.addElement("student");               sNode.addAttribute("examid", student.getExamid());               sNode.addAttribute("idcard", student.getIdcard());                  sNode.addElement("name").setText(student.getName());               sNode.addElement("location").setText(student.getLocation());               sNode.addElement("grade").setText(student.getGrade() + "");                  write2Xml(document);              } catch (Exception e) {                  throw new RuntimeException();           }       }          // 查找学生       @Test       public Student selectUser(String examid) throws DocumentException {           Document document = getDocument();              Element e = (Element) document.selectSingleNode("//student[@examid='"                   + examid + "']");           if (e != null) {               Student s = new Student();               s.setExamid(e.attributeValue("examid"));               s.setIdcard(e.attributeValue("idcard"));                  s.setName(e.element("name").getText());               s.setLocation(e.element("location").getText());               s.setGrade(Double.parseDouble(e.element("grade").getText()));                  return s;           } else {               return null;           }              /*           * // List list=document.getRootElement().selectNodes("student"); List           * list=document.selectNodes("//student");//使用xpath Iterator           * it=list.iterator(); while(it.hasNext()) { Element e=(Element)           * it.next(); String value=e.attributeValue("examid");           * if(value.equals(examid)) { Student s = new Student();           * s.setExamid(e.attributeValue("examid"));           * s.setIdcard(e.attributeValue("idcard"));           *            * s.setName(e.element("name").getText());           * s.setLocation(e.element("location").getText());           * s.setGrade(Double.parseDouble(e.element("grade").getText()));           *            * return s; } }           *            * return null;           */       }          // 删除学生       @Test       public void deleteUser(String name) {           try {               Document document = getDocument();               List list = document.selectNodes("//name");               Iterator it = list.iterator();               // Element nameNode1=(Element) it.next();               // System.out.println(nameNode1.getText());               while (it.hasNext()) {                   Element nameNode = (Element) it.next();                   String value = nameNode.getText();                   if (value.equals(name)) {                       // System.out.println(nameNode.getText());                       nameNode.getParent().getParent()                               .remove(nameNode.getParent());                       write2Xml(document);                       return;                   }               }               throw new RuntimeException("删除失败");              } catch (Exception e) {               throw new RuntimeException(e);           }       }          // 获得操作xml的对象 获得document对象          public Document getDocument() throws DocumentException {           SAXReader reader = new SAXReader();           Document document = reader.read(new File("src//student.xml"));              /*           * 2.解析XML形式的文本,得到document对象.                         * String text ="";           * Document document =DocumentHelper.parseText(text);           *            * 3.主动创建document对象.                         * Document document =DocumentHelper.createDocument();           * //创建根节点 Element root =document.addElement("members");           */              return document;       }          // 将内存中的内容写入xml       public void write2Xml(Document document) throws IOException {           //1.文档中全为英文,不设置编码,直接写入的形式           XMLWriter writer = new XMLWriter(new FileOutputStream("src//student.xml"));           writer.write(document);           writer.close();              //      2.文档中含有中文,设置编码格式写入的形式   //      OutputFormat format = OutputFormat.createPrettyPrint();// 指定XML编码                      //       format.setEncoding("GBK");          //       XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);   //       writer.write(document);writer.close();          }   }      class Student {       /*       *  张三       * 广州 100        */          private String examid;       private String idcard;       private String name;       private String location;       private double grade;          public String getExamid() {           return examid;       }          public void setExamid(String examid) {           this.examid = examid;       }          public String getIdcard() {           return idcard;       }          public void setIdcard(String idcard) {           this.idcard = idcard;       }          public String getName() {           return name;       }          public void setName(String name) {           this.name = name;       }          public String getLocation() {           return location;       }          public void setLocation(String location) {           this.location = location;       }          public double getGrade() {           return grade;       }          public void setGrade(double grade) {           this.grade = grade;       }   }  

 

3、DMO与SAX的区别

一、DOM:拉模型,把整个文档加载到内存中        优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;        缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;        使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)

二、SAX:推模型,事件驱动编程,基于回调SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。    优点:不用事先调入整个文档,占用资源少;

缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;

使用场合:数据量较大的XML文档,占用内存高,机器内存少,无法一次加载XML到内存;只需XML文档的少量内容,很少回头访问;                          

三、JDOM:为减少DOM、SAX的编码量,出现了JDOM;        优点:20-80原则,极大减少了代码量,提供常用API减少重复劳动         使用场合:要实现的功能简单,如解析、创建等Java程序

 但在底层,JDOM还是使用SAX(最常用)、DOM

性能比较 

1)DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J. 

2)JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM.虽然JDOM的开发者已经说明 他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语 言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在 JavaScript中使用DOM)。 

3)SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3