ch6 DOM解析XML文档

合集下载

dom解析xml原理

dom解析xml原理

dom解析xml原理DOM(Document Object Model)是一种用于处理和表示XML文档的标准。

通过DOM,开发者可以很容易地访问和操作XML文档的内容。

DOM解析XML的原理是将整个XML文档加载到内存中,构建一个树状结构的节点,并通过节点之间的关系来表示XML元素的层次结构。

在DOM解析XML的过程中,主要包括以下几个步骤:1. 加载XML文档:首先,需要将XML文档加载到内存中。

一般情况下,可以通过读取XML文件或者通过网络请求获取XML数据,并将其保存在内存中。

2. 构建DOM树:加载XML文档后,解析器会根据XML的语法规则将其解析成一棵树状结构的节点,也就是DOM树。

DOM树由各种类型的节点组成,包括元素节点、属性节点、文本节点等。

3. 遍历DOM树:通过遍历DOM树,可以访问和操作XML文档的各个部分。

可以通过获取根节点来开始遍历,然后通过节点之间的关系,如父节点、子节点、兄弟节点等,实现对XML元素的访问和操作。

4. 解析和处理节点:在遍历DOM树的过程中,可以根据节点的类型来进行不同的操作。

例如,对于元素节点,可以获取其标签名、属性值,以及子元素等信息;对于属性节点,可以获取其名称和值;对于文本节点,可以获取其内容等。

5. 数据处理和应用:一旦解析和处理XML文档的节点,可以将其应用到实际的业务逻辑中。

例如,可以将解析得到的数据存储到数据库中,或者根据解析结果生成HTML页面等。

DOM解析XML的优点是易于使用和操作,可以轻松地访问和修改XML文档的内容。

然而,由于将整个XML文档加载到内存中,对于大型XML文档来说,会占用较多的内存资源。

另外,由于DOM树的构建需要将所有的节点加载到内存中,对于大型XML文档来说,解析和构建DOM树的过程会相对较慢。

相比于DOM解析,还有一种称为SAX(Simple API for XML)解析的方法。

与DOM不同的是,SAX解析器在读取XML文档时,并不会将整个文档加载到内存中,而是一边读取,一边解析。

C#使用DOM解析XML

C#使用DOM解析XML

C#使用XML实现DOMDOM的全称是Document Object Model(文档对象模型),它是来自W3C的官方标准,它允许按照W3C标准W3C DOM Level1和W3C DOM Level2的规范所定义的规则,通过编程来读取,操纵和修改XML文档。

DOM的工作方式是:首先将XML文档一次性的装入内存,然后根据文档中定义的元素和属性在内存中创建一个“树型结构”也就是一个文档对象模型,这里的含义其实是把文档对象化,文档中每个节点对应着模型中一个对象,而我们都知道对象提供编程接口,所以在Application中我们正是使用这组对象来访问XML文档进而操作XML文档,下图阐述了Application和DOM交互的过程:DOM既然是在内存中创建树型结构视图进而提供编程接口,那我们就以下面这个XML 片段来说明DOM是如何创建树型结构的:<parent><child id=”123”>text here</child></parent>如果用DOM加载以上文档,它将在内存中创建的树型结构如下图:DOM的关键在于它允许直接更新内存中的树型结构,而不必重定向到其他输出,因此,添加、更新或删除结构中信息的操作效率更高。

而作为程序员的我们重要的是要了解DOM 所提供的编程接口以实现对XML文档进行操作。

.NET Framework定义了一组类用于反映DOM的体系结构,下面来看一下.NET DOM 的继承结构:在上图中所有弧角矩形中所包含的类描述了所有可能在XML文档中出现的节点类型,而操作XML文档不外乎是操作其中的节点,这些类又都是从XmlNode类派生而来,所以这里讨论XmlNode类和它的子类XmlDocument,下面对这些类做简单的介绍:XmlNode类:该类是DOM中所有其他节点的抽象基类,它定义所有在更低级的类中继承或重写的成员。

它表示XML文档中的单一节点,它提供了用于导航DOM树型结构的基本方法和属性,使用XmlNodeType枚举器可以枚举其下的所有节点类型。

解析Xml文件的三种方式

解析Xml文件的三种方式

解析Xml⽂件的三种⽅式1、Sax解析(simple api for xml) 使⽤流式处理的⽅式,它并不记录所读内容的相关信息。

它是⼀种以事件为驱动的XML API,解析速度快,占⽤内存少。

使⽤回调函数来实现。

1class MyDefaultHander extends DefaultHandler{2private List<Student> list;3private Student student;45 @Override6public void startDocument() throws SAXException {7super.startDocument();8 list=new ArrayList<>();9 }1011 @Override12public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {13super.startElement(uri, localName, qName, attributes);14if(qName.equals("student")){15 student=new Student();1617 }18 preTag=qName;19 }2021 @Override22public void endElement(String uri, String localName, String qName) throws SAXException {23if(qName.equals("student")){24 list.add(student);25 }26 preTag=null;27 }2829 @Override30public void characters(char[] ch, int start, int length) throws SAXException {31if(preTag!=null){32if(preTag.equals("id")){33 student.setId(Integer.parseInt(new String(ch,start,length)));34 }else if(preTag.equals("name")){35 student.setName(new String(ch,start,length));36 }else if(preTag.equals("age")){37 student.setAge(Integer.parseInt(new String(ch,start,length)));38 }39 }40 }41public List<Student> getStudents(){42return list;43 }44 }45public List<Student> sax_parser(){46 List<Student> list=null;47try {48 SAXParser parser= SAXParserFactory.newInstance().newSAXParser();49 InputStream is= getAssets().open("student.xml");50 MyDefaultHander hander=new MyDefaultHander();51 parser.parse(is,hander);52 list= hander.getStudents();53 } catch (ParserConfigurationException e) {54 e.printStackTrace();55 } catch (SAXException e) {56 e.printStackTrace();57 } catch (IOException e) {58 e.printStackTrace();59 }60return list;61 }2、Dom解析 DOM(Document Object Model) 是⼀种⽤于XML⽂档的对象模型,可⽤于直接访问XML⽂档的各个部分。

Android学习笔记---Android平台1.使用dom解析xml文件

Android学习笔记---Android平台1.使用dom解析xml文件
Android学习笔记---Android平台1.使用dom解析xml文件 1.使用dom解析xml文件除了使用 SAX可以解析XML文件,大家也可以使用熟悉的DOM来解析XML文件。 DOM解析 XML文 n n 件时,会将XML文件的所有内容以文档树方式存放在内存中,然后允许您使用DOM API遍历XML n n 树、检索所需的数据。使用DOM操作XML的代码看起来是比较直观的,并且在编码方面比基于 n n SAX的实现更 加简单。但是,因为DOM需要将XML文件的所有内容以文档树方式存放在内存中, n n 所以内存的消耗比较大, 特别对于运行Android的移动设备来说,因为设备的资源比较宝贵, n n 所以建议还是采用SAX来解析XML文 件,当然,如果XML文件的内容比较小采用DOM也是可行的代码请看本页下方备注 import java.io.InputStream; import java.util.ArrayList; import java.util.List; n n import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; n n import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; n n import cn.itcast.xml.domain.Person; /** n* 使用Dom解析xml文件 n* n*/ public class DomXMLReader { n n public static List readXML(InputStream inStream) { List persons = new ArrayList(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = factory.newDocumentBuilder(); Document dom = builder.parse(inStream); Element root = dom.getDocumentElement(); NodeList items = root.getElementsByTagName("person");// 查找所有 n n person节点 for (int i = 0; i < items.getLength(); i++) { Person person = new Person (); //得到第一个person节点 Element personNode = (Element) items.item(i); //获取person节点的id属性 值 person.setId(new Integer(personNode.getAttribute("id"))); //获取person节点下的所有子节点(标签 之间的空白节点和 n n name/age元素) NodeList childsNodes = personNode.getChildNodes(); for (int j = 0; j < childsNodes.getLength(); j++) { Node node = (Node) childsNodes.item(j);n n n n //判断是 否为元素类型 if(node.getNodeType() == Node.ELEMENT_NODE){ n n n n nElement childNode = (Element) node; n n n n n n n n n n n n n n n n n n n n //判断是否name元素 n nif ("name".equals (childNode.getNodeName())) { n n //获取name元素下Text节点,然后从Text节点获取数据 n n n n n n person.setName(childNode.getFirstChild n n ().getNodeValue()); n n} else if (“age”.equals (childNode.getNodeName())) { person.setAge(new Short(childNode.getFirstChild n n ().getNodeValue ())); n n} } n n n n} n npersons.add(person); } inStream.close(); } catch (Exception e) { e.printStackTrace(); } return persons; } ---------------------------------------------------------

phpDOM解析xml文档以及对节点增删改查实现(精)

phpDOM解析xml文档以及对节点增删改查实现(精)

πηπ ∆OM就是基于树的解析器,这需要你将ξμλ文档看成一个树状的结构(xml 文档介绍),看看下面一个简单的ξμλ文档:1 xml version="1.0" encoding="UTF-8" ?>234 小明5 男6 11789 小红10 女11 211213下面就来实现对上面χλασσ.ξμλ文档的节点的操作:πηπ ∆OM实现遍历节点:14 php15 //创建DOMDocument对象16 $xmldoc = new DOMDocument(;17 //加载指定xml18 $xmldoc->load("class.xml";19 $stus =$xmldoc->getElementsByTagName("stu";20 //访问name节点的值21 echo $stus->item(1->getElementsByTagName("name"->item(0->nodeValue;22 ?>增加节点操作:23 php24 $xmldoc =new DOMDocument(;25 $xmldoc->load("class.xml";26 $root = $xmldoc->getElementsByTagName("classes"->item(0;27 $stu_node = $xmldoc->createElement("stu";28 //给该学生增加一个属性29 $stu_node->setAttribute("intro","这是一个好学生";30 $name_node = $xmldoc->createElement("name";31 $name_node->nodeValue="";32 $stu_node->appendChild($name_node;33 $sex_node = $xmldoc->createElement("sex";34 $sex_node->nodeValue="男";35 $stu_node->appendChild($sex_node;36 $age_node = $xmldoc->createElement("age";37 $age_node->nodeValue=23;38 $stu_node->appendChild($age_node;39 $root->appendChild($stu_node;40 $xmldoc->save("new_class.xml";41 ?>删除节点操作:42 php43 $xmldoc =new DOMDocument(;44 $xmldoc->load("new_class.xml";45 //想删除必须找到它46 $stus=$xmldoc->getElementsByTagName("stu";47 $stu1=$stus->item(0;48 $stu1->parentNode->removeChild($stu1;49 $xmldoc->save("delete_class.xml";50 ?>更新节点操作:51 php52 $xmldoc =new DOMDocument(;53 $xmldoc->load("new_class.xml";54 //找到才能更新啊55 $stus=$xmldoc->getElementsByTagName("stu";56 //取出第一个学生57 $stu1=$stus->item(0;58 //把age改成10059 $stu1_age = $stu1->getElementsByTagName("age"->item(0;60 $stu1_age->nodeValue =100;61 $xmldoc->save("new_class.xml";?>欢迎转载!原文地址: /php/php-dom.html,转载请注明地址,谢谢!。

DOM解析Xml文件示例

DOM解析Xml文件示例

DOM解析Xml文件示例DOM XML Parser are easiest to understand, it loads the XML object into memory as Document, then you can easily traverse different elements and nodes in the object. The traversing of elements and nodes are not required to be in order.DOM Parser are good for small XML documents but since it loads complete XML file into memory, its not good for large XML files. For large XML files, you should use SAX Parser.In this tutorial we will read the XML file and parse it to create object from it.Here is the XML file that will be read in this program.So this XML is the list of employees, to read these I will create a bean object Employee and then we will read the XML to get the list of employees.Here is the Employee bean object.private Stringname;private Stringgender;privateint age;private Stringrole;public String getName(){return name;}publicvoid setName(String name){= name;}public String getGender(){return gender;}publicvoid setGender(String gender){this.gender= gender;}publicint getAge(){return age;}publicvoid setAge(int age){this.age= age;}public String getRole(){return role;}publicvoid setRole(String role){this.role= role;}public String toString(){return"Employee:: Name="++" Age="+this.age+" Gender="+this.gender+" Role="+this.role;}}Notice that I have overridden toString() method to print useful information about employee.Read this post to know you should always use @Override annotation to override methods.If you are new to annotations, read java annotations tutorial.Here is the java program that uses DOM Parser to read and parse XML file to get the list of Employee object.package com.journaldev.xml;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;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;publicclass XMLReaderDOM{publicstaticvoid main(String[] args){String filePath ="src/main/resources/employee.xml";File xmlFile =new File(filePath);DocumentBuilderFactory dbFactory =DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder;try{dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(xmlFile);doc.getDocumentElement().normalize();System.out.println("Root element :"+doc.getDocumentElement().getNodeName());NodeList nodeList = doc.getElementsByTagName("Employee");// now XML is loaded as Document in memory, lets convert it to// Object ListList<Employee> empList =new ArrayList<Employee>();for(int i = 0; i < nodeList.getLength(); i++){empList.add(getEmployee(nodeList.item(i)));}// lets print Employee list informationfor(Employee emp : empList){System.out.println(emp.toString());}}catch(SAXException | ParserConfigurationException | IOException e1){ e1.printStackTrace();}}privatestatic Employee getEmployee(Node node){// XMLReaderDOM domReader = new XMLReaderDOM();Employee emp =new Employee();if(node.getNodeType()== Node.ELEMENT_NODE){Element element =(Element) node;emp.setName(getTagValue("name", element));emp.setAge(Integer.parseInt(getTagValue("age", element)));emp.setGender(getTagValue("gender", element));emp.setRole(getTagValue("role", element));}return emp;}privatestatic String getTagValue(String tag, Element element){ NodeList nodeList =element.getElementsByTagName(tag).item(0).getChildNodes();Node node =(Node) nodeList.item(0);return node.getNodeValue();}}Output of the above program is:1 2 3 Root element :EmployeesEmployee:: Name=Pankaj Age=29 Gender=Male Role=Java Developer Employee:: Name=Lisa Age=35 Gender=Female Role=CSS DeveloperIn real life, it’s not a bad idea to validate XML file before parsing it to objects, learn how to validate XML against XSD in java.。

xml文件解析方法

xml文件解析方法XML文件解析方法引言:XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有良好的可读性和灵活性,被广泛应用于数据交换和配置文件等领域。

在处理XML文件时,解析是必不可少的环节。

本文将介绍几种常用的XML文件解析方法,包括DOM、SAX和StAX。

一、DOM解析方法DOM(文档对象模型)是一种将整个XML文件以树形结构加载到内存中的解析方法。

DOM解析器将XML文件解析为一个树状结构,通过遍历节点来获取和操作XML文件中的数据。

DOM解析方法的优点是易于理解和使用,可以随机访问XML文件中的任意节点,但缺点是占用内存较大,不适用于大型XML文件的解析。

1. 创建DOM解析器对象:使用标准的Java API,可以通过DocumentBuilderFactory类来创建DOM解析器对象。

2. 加载XML文件:通过DOM解析器对象的parse()方法加载XML文件,将其转化为一个树形结构。

3. 遍历节点:使用DOM解析器对象提供的方法,如getElementsByTagName()、getChildNodes()等,可以遍历XML文件中的各个节点,获取节点的名称、属性和文本内容等信息。

4. 获取节点数据:通过节点对象提供的方法,如getNodeName()、getTextContent()等,可以获取节点的名称和文本内容。

二、SAX解析方法SAX(简单API for XML)是一种基于事件驱动的XML解析方法。

在SAX解析过程中,解析器顺序读取XML文件,当遇到节点开始、节点结束或节点文本等事件时,会触发相应的回调方法。

相比于DOM 解析方法,SAX解析方法具有内存占用小、解析速度快的优点,但缺点是无法随机访问XML文件中的节点。

1. 创建SAX解析器对象:使用标准的Java API,可以通过SAXParserFactory类来创建SAX解析器对象。

2. 实现事件处理器:自定义一个事件处理器,实现SAX解析器提供的DefaultHandler类,并重写相应的回调方法,如startElement()、endElement()和characters()等。

如何使用DOM解析XML文件

如何使用DOM解析XML文件DOM(Document Object Model)是一种用于解析和处理XML文件的常用技术。

DOM API允许开发者以树形的数据结构方式访问和操作XML文件的内容。

1.导入DOMAPI:首先,你需要在你的代码中导入DOMAPI相关的类和方法。

在大多数编程语言中,都有现成的DOM库可供使用。

3. 加载XML文件:将要解析的XML文件加载到解析器中,可以使用解析器的`load(`或`parse(`方法,这个方法会将XML文件读取到内存中。

4. 创建一个DOM树:通过调用解析器的`getDocument(`或`parse(`方法,可以获取解析器对XML文件进行解析后的DOM树对象。

5. 获取根节点:通过DOM树对象的`getDocumentElement(`方法,可以获取XML文件的根节点。

6. 遍历子节点:通过DOM树对象的`getChildNodes(`方法,可以获取根节点的所有子节点。

然后,你可以使用循环遍历这些子节点,获取它们的内容和属性,并进一步操作。

7. 获取节点内容:通过DOM树节点对象的`getNodeValue(`方法,可以获取节点的文本内容。

如果节点有子节点,可以使用`getChildNodes(`方法获取它们的内容。

8. 获取节点属性:通过DOM树节点对象的`getAttribute(`方法,可以获取节点的属性值。

你需要在括号中指定要获取的属性名称。

9. 修改节点内容:通过DOM树节点对象的`setNodeValue(`方法,可以修改节点的文本内容。

10. 修改节点属性:通过DOM树节点对象的`setAttribute(`方法,可以修改节点的属性值。

你需要在括号中指定要修改的属性名称和新值。

11. 创建新节点:通过DOM树节点对象的`createElement(`方法,可以创建一个新节点对象。

你需要在括号中指定节点名称。

12. 添加节点:通过DOM树节点对象的`appendChild(`方法,可以将新节点添加为现有节点的子节点。

dom解析xml文件的案例

dom解析xml文件的案例DOM (Document Object Model) 是一种用于解析和操作 XML 文件的标准。

它将 XML 文件表示为一个树状结构,其中每个节点都是一个对象,可以通过 DOM 提供的方法和属性来访问和修改节点的内容。

下面列举了十个使用 DOM 解析 XML 文件的案例,以帮助读者更好地理解和应用 DOM 技术。

1. 读取 XML 文件:使用 DOM 可以将 XML 文件加载到内存中,并以树状结构表示。

通过遍历这个树状结构,可以访问和提取 XML 文件的内容。

2. 导航节点:DOM 提供了一系列方法来导航 XML 文件中的节点,例如获取父节点、子节点、兄弟节点等。

这些方法使得在 XML 文件中定位和操作节点变得非常方便。

3. 获取节点的属性:在 XML 文件中,节点可以拥有一些属性,这些属性用来描述节点的特征和特性。

使用 DOM,可以轻松获取节点的属性值,并根据这些属性值进行进一步的处理。

4. 修改节点的内容:DOM 允许修改 XML 文件中节点的内容。

可以使用 DOM 提供的方法来修改节点的文本内容、属性值等信息,从而实现对 XML 文件的动态更新。

5. 创建新节点:使用 DOM,可以创建新的节点并将其添加到 XML文件中。

可以使用 DOM 提供的方法来创建元素节点、文本节点、属性节点等,并通过操作来实现节点的插入、删除等操作。

6. 删除节点:DOM 允许删除 XML 文件中的节点。

可以使用 DOM 提供的方法来删除指定的节点,从而实现对 XML 文件的内容进行清理和精简。

7. 解析 CDATA 节点:CDATA 节点是一种特殊的节点,它用于存储XML 文件中的文本内容,这些内容可能包含一些特殊字符。

使用DOM,可以轻松解析 CDATA 节点,并获取其中的文本内容。

8. 解析命名空间:XML 文件中可以使用命名空间来区分不同的元素和属性。

使用 DOM,可以解析命名空间,并通过命名空间来访问和操作 XML 文件中的元素和属性。

Java如何基于DOM解析xml文件

Java如何基于DOM解析xml⽂件⼀、Java解析xml、解析xml四种⽅法、DOM、SAX、JDOM、DOM4j、XPath此⽂针对其中的DOM⽅法具体展开介绍及代码分析sax、dom是两种对xml⽂档进⾏解析的⽅法(没有具体实现,只是接⼝),所以只有它们是⽆法解析xml⽂档的;jaxp只是api,它进⼀步封装了sax、dom两种接⼝,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默认使⽤xerces解释器)。

如果是嵌⼊式的情况下建议使⽤sax⽅法进⾏解析,因为它不需要⼀下⼦把数据都保存到内存中然后再解析是可以逐步解析的。

⽽DOM不⾏,必须⼀次性把数据存到内存中,然后⼀并解析。

这样做虽然速度会很快,但是同时也加⼤了对内存的消耗。

如果⽂件很⼤的情况下不建议DOM解析。

⼆、【DOM 简单使⽤介绍】1、【DOM(Document Object Model) 】由W3C提供的接⼝,它将整个XML⽂档读⼊内存,构建⼀个DOM树来对各个节点(Node)进⾏操作。

下⾯⼀段是DOM解析xml的⼀个案例⼀起来看⼀下。

【xml原⽂件】<?xml version = "1.0" encoding = "UTF-8"?><staffs><staff id="1"><name>Tom_zhang1</name><age>19</age><sex>男</sex><phone>186********</phone><group><id>1</id><name>Technical department</name></group></staff><staff id="2"><name>Susy_wang</name><age>18</age><sex>⼥</sex><phone>189********</phone><group><id>2</id><name>Financial department</name></group></staff><staff id="3"><name>Jack_Ma</name><age>45</age><sex>男</sex><phone>1867755334</phone><group><id>3</id><name>Financial department</name></group></staff></staffs>【代码】Staff 类package Entity;public class Staff {private int id;private String name;private int age;private String sex;private String phone;private StuGroup group;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public StuGroup getGroup() {return group;}public void setGroup(StuGroup group) {this.group = group;}public Staff() {super();// TODO Auto-generated constructor stub}public Staff(int id, String name, int age, String sex, String phone,StuGroup group) {super();this.id = id; = name;this.age = age;this.sex = sex;this.phone = phone;this.group = group;}@Overridepublic String toString() {return "Staff [age=" + age + ", group=" + group + ", id=" + id+ ", name=" + name + ", phone=" + phone + ", sex=" + sex + "]";}}Group 类package Entity;public class Group {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public Group() {super();// TODO Auto-generated constructor stub}public Group(int id, String name) {super();this.id = id; = name;}@Overridepublic String toString() {return "Group [id=" + id + ", name=" + name + "]";}}注释: Staff类不需解释,xml⽂件中有⼏个<>就需要创建⼏个字段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

alert(XMLNode.childNodes.length);
</script>
//将BookInfo的子元素数目显示在对话框上
应用程序与XML文档的关系图
XML XML XML
DOM接口
应 用 程 序
SAX接口
分 析 器
文 档
现在能提供这个功能的XML应用程序接口(API)有以下两个: 文档对象模式(Document Object Model,DOM) 它是由W3C组织制定的一个文档模型规范。 XML简单应用程序接口(Simple API for XML,SAX) 它是由XML_DEV邮件列表成员开发的。
通过上面对XML解析器的分类,我们不难看出:XML解析器有很
多种。到底哪一种最适合你呢?这要根据具体的情况来选择。
本章我们将选择一种流行的用于Java平台的XML解析技术:

DOM(文档对象模型),一个来自W3C的成熟标准
现在使用的解析器大部分都是java编写的。最为 流行的XML解析器来自Apache组织提供的Xerces 项目。这是一个跨语言的XML解析器。 所有现代浏览器都有读取和操作 XML 内建 XML 解析器。解析器把 XML 载入内存,然后把它转换 为可通过 JavaScript 访问的 XML DOM 对象。
该索引值从0开始,获得一个该接口的实例化对象,实 际上就是获得一个节点的集合,只不过开始时指针在 第一个节点前面
Document接口
Document接口表示整个HTML或XML文档,是文档
树的根,作为对XML文档进行操作时入口节点。 由于所有的其他节点必须在文档内,Document接 口提供了创建其他节点对象的方法,以及操作文 档结构及其特性的方法。 Document节点可以包含多个处理指令和多个注释 作为其子节点,XML文档根元素节点是唯一
1 加载 2 创建对应DOM树
DOM解析器
XML文档
3 对树上的节点操作
DOM的优点和缺点
DOM 以及广义的基于树的处理具有几个优点 由于树在内存中是持久的,因此可以修改它以 便应用程序能对数据和结构作出更改。它还可 以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。 DOM 使用起来比较简单 对于特别大的文档,解析和加载整个文档可能 很慢且很耗资源,因此使用其他手段来处理这 样的数据会更好,比如 SAX。
DOM文档树模型【重点掌握】
XML 文档中的每个成分都是一个节点,DOM 是这样规定的:
整个文档是一个文档节点 每个 XML 标签是一个元素节点 包含在 XML 元素中的文本是文本节点 每一个 XML 属性是一个属性节点 注释属于注释节点

<?xml version="1.0" encoding="GB2312"?> <学生信息表> <!-- this is an example --> <学生> <姓名> <姓>刘</姓><名字>海松</名字> </姓名> <?xml version="1.0" encoding="GB2312"?>
DOM 是以层次结构组织的节点或信息片断的 集合。这个层次结构允许开发人员在树中寻找特 定信息。分析该结构通常需要加载整个文档和构 造层次结构,然后才能做任何工作。由于它是基 于信息层次的,因而DOM被认为是基于树或基于 对象的。 DOM以树状结构组织XML文档的每个节点, 在访问树的节点之前,必须先加载整个XML文档, 并构造对应的树,解析器才能开始解析。
<bookstore>
<book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> Document节点
处理指令
<price>29.99</price>
XML解析器应该是这样的一个程序:

XML解析器能够对XML文档进行分析 XML解析器提供访问XML数据的应用程序接口(API) XML解析器可以读取、更新、创建、操作一个XML文档
如何使用一个解析器?通常情况下,按如下步骤来使用 XML解析器:


创建一个解析器对象 将您的 XML 文档传递给解析器 处理结果
DOM基本接口【重点掌握】
Node接口
Document接口
NodeList接口
NameNodeMap接口 Element接口 Text接口
Node接口
Dom接口中有很大一部分接口是从Node接口

继承过来的。Node接口代表了树中的一个节 点,提供了访问DOM树中元素内容与信息的途 径,并给出了对DOM树中的元素进行遍历的方 法。 将从Node接口继承的各个子接口分别实现后, 就形成节点树中常见的不同类型的节点,如属 性节点,文本节点和元素节点等
姓名
姓 名字
性别

班级
08211 学号
出生日期
年 月 日

海松
21
1977
11
24
XML文档中所有元素对应于DOM树的节点类型
节点l类型
Document DocumentFragment DocumentType Element Text Attr ProceesingInstruction Comment
通过微软的 XML 解析器来加载XML
微软的 XML 解析器内建于 IE 5 以及更高的版本 中。下面的 JavaScript 片段把一个 XML 文档载 入解析器中:
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.load("note.xml"); ① ② ③
DOM被分为不同的部分 核心DOM:定义了一套标准的用于任何结 构化文档的对象 XML DOM:定义了一套标准的用于XML文 档的对象 HTML DOM:定义了一套标准的用于HTML 文档的对象
XML DOM是针对XML的文档对象模型的W3C标准,它 独立与平台语言,Java Script Language、VB Script Language以及C#、JAVA等大多数语言都支持文档对象 模型。
NodeList接口
NodeList接口提供对节点的有序集合的抽象,用于表示
有顺序关系的一组节点。如某个节点的子节点序列。
例如:GetNodeByName方法的返回某个节点的子节点序列
NodeList的对象是活动的,对文档的改变会直接反映
到相关的NodeList对象中
NodeList中的每个item都可以通过一个索引来访问,
基于DOM的XML分析器将一个XML文档转换 成一个对象模型的集合(通常称DOM树)存放在 内存里。应用程序通过对这个DOM树的操作,从 而实现对XML文档数据的操作。通过DOM接口 ,应用程序可以在任何时候访问XML文档中的任 何一部分数据,因此,这种利用DOM接口的机制 也被称作随机访问机制。
第六章 DOM解析XML文档
学 习 目 标
掌握DOM的概念
熟练掌握DOM文档树模型
掌握DOM对象的创建和调用方法 熟练掌握访问各种类型节点 掌握动态创建XML文档的方法 熟练掌握各种类型节点的添加、删除等操作
当XML文档作为数据交换工具时,应用程序必须 采用适合的方式来获取XML文档里包含的有用信息, 最直接,最容易想到的方法就是通过文件I/O来读取 XML文档里包含的信息。这种方法不仅效率太低, 而且编程复杂,显然不是一个好方法。
XML解析器【重点掌握】
XML 文档
XML解析器
API
应用 程序
在解析XML文档时,通常是利用现有的XML解 析器对XML文档进行解析,而编写的应用程序则 通过解析器提供的API接口来获取XML数据。 多数解析器提供了至少两种API,一种是对象 模型API(DOM)和一个事件API(SAX)。
什么是XML解析器
XML解析器的种类
有不同的方法来划分解析器种类:


验证或非验证解析器 支持 Document Object Model (DOM) 的解析器 支持 Simple API for XML (SAX) 的解析器 用特定语言编写的解析器 (Java, C++, Perl 等)

如:用Java编写的解析器有JDOM,Apache的Xerces及IBM 的XML4J;用C++编写的解析器有IBM的XML4C等等。
Document
学生信息表
<性别>男</性别>
<班级 学号="21">08211</班级> <出生日期> <日>24</日><月>11</月><年>1977</年> </出生日期>
注释节点
学生
学生
</学生>
<学生> <姓名> <姓>刘</姓><名字>红霞</名字> </姓名> <性别>女</性别> <班级 学号="151">08211</班级> <出生日期> <日>17</日><月>10</月><年>1983</年> </出生日期> </学生> </学生信息表>
相关文档
最新文档