XML基础+Java解析XML +几种解析方式的性能比较 |
您所在的位置:网站首页 › java程序是用来解析什么文件的 › XML基础+Java解析XML +几种解析方式的性能比较 |
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、为何使用SchemaXML 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解析XMLl 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 |