使用DOM解析XML文档
- 格式:ppt
- 大小:1.22 MB
- 文档页数:99
学习:Dom4j1、DOM4J简介DOM4J是 出品的一个开源XML 解析包。
DOM4J应用于Java 平台,采用了Java 集合框架并完全支持DOM,SAX 和JAXP。
DOM4J 使用起来非常简单。
只要你了解基本的XML-DOM 模型,就能使用。
Dom:把整个文档作为一个对象。
DOM4J 最大的特色是使用大量的接口。
它的主要接口都在org.dom4j里面定义:接口之间的继承关系如下:interface ng.Cloneableinterface org.dom4j.Nodeinterface org.dom4j.Attributeinterface org.dom4j.Branchinterface org.dom4j.Documentinterface org.dom4j.Elementinterface org.dom4j.CharacterDatainterface org.dom4j.CDATAinterface mentinterface org.dom4j.Textinterface org.dom4j.DocumentTypeinterface org.dom4j.Entityinterface org.dom4j.ProcessingInstruction2、XML文档操作12.1、读取XML文档:读写XML文档主要依赖于org.dom4j.io包,有DOMReader和SAXReader两种方式。
因为利用了相同的接口,它们的调用方式是一样的。
public static Docum ent load(String filenam e) {Document docum ent =null;try {SAXReader saxReader = new SAXReader();docum ent =saxReader.read(new File(filename)); //读取XML文件,获得docum ent 对象} catch (Exception ex) {ex.printStackTrace();}return docum ent;}或public static Docum ent load(URL url) {Document docum ent =null;try {SAXReader saxReader = new SAXReader();docum ent =saxReader.read(url); //读取XML文件,获得docum ent对象} catch (Exception ex) {ex.printStackTrace();}return docum ent;}//读取指定的xml文件之后返回一个Document对象,这个对象代表了整个XML文档,用于各种Do m运算。
解析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⽂档的各个部分。
Qt中使用DOM对XML进行的各种解析(总结)前几天因为底层拓扑结构发生了变化,导致拓扑文件发生了变化,我负责的对于拓扑文件的解析操作自然也就要推到重来。
利用上个周末的时间,把这个任务搞定了,顺便也利用这个时间好好总结下这次学到的知识。
我们知道,QT中对于XML文件的读写无非就两种方式,DOM和SAX,两种方法的具体介绍如下:/***************************************我是传说中的分割线**************************************************************/用于读取和操作XML 文件的标准是文档对象模型DOM。
DOM为XML 文档的已解析版本定义了一组接口。
解析器读入整个文档,然后构建一个驻留内存的树结构,然后您的代码就可以使用DOM 接口来操作这个树结构。
您可以遍历树以了解原始文档包含了什么,您可以删除树的几个部分,还可以重新排列树和添加新的分支,等等。
遗憾的是,因为DOM 方法涉及读取整个文件并将该文件存储在一个树结构中,而这样可能是低效的、缓慢的,并且很消耗资源:DOM 构建整个文档驻留内存的树。
如果文档很大,就会要求有极大的内存。
DOM 创建表示原始文档中每个东西的对象,包括元素、文本、属性和空格。
如果您只需关注原始文档的一小部分,那么创建那些永远不被使用的对象是极其浪费的。
DOM 解析器必须在您的代码取得控制权之前读取整个文档。
对于非常大的文档,这会引起显著的延迟。
这些仅仅是由文档对象模型的设计引起的问题;撇开这些问题,DOM API 是解析XML 文档非常有用的方法。
一种替代技术就是SAX。
相比于文档对象模型DOM,SAX 是读取和操作XML 数据的更快速、更轻量的方法。
SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。
它不涉及DOM所必需的开销和概念跳跃。
SAX API是一个基于事件的API,适用于处理数据流,即随着数据的流动而依次处理数据。
org.w3c.dom(javadom)解析XML⽂档位于org.w3c.dom操作XML会⽐较简单,就是将XML看做是⼀颗树,DOM就是对这颗树的⼀个数据结构的描述,但对⼤型XML⽂件效果可能会不理想⾸先来了解点Java DOM 的 API:1.解析器⼯⼚类:DocumentBuilderFactory创建的⽅法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();2.解析器:DocumentBuilder创建⽅法:通过解析器⼯⼚类来获得 DocumentBuilder db = dbf.newDocumentBuilder();3.⽂档树模型Document创建⽅法:a.通过xml⽂档 Document doc = db.parse("bean.xml"); b.将需要解析的xml⽂档转化为输⼊流 InputStream is = new FileInputStream("bean.xml");Document doc = db.parse(is);Document对象代表了⼀个XML⽂档的模型树,所有的其他Node都以⼀定的顺序包含在Document对象之内,排列成⼀个树状结构,以后对XML⽂档的所有操作都与解析器⽆关,直接在这个Document对象上进⾏操作即可;包含的⽅法:4.节点列表类NodeListNodeList代表了⼀个包含⼀个或者多个Node的列表,根据操作可以将其简化的看做为数组5.节点类NodeNode对象是DOM中最基本的对象,代表了⽂档树中的抽象节点。
但在实际使⽤中很少会直接使⽤Node对象,⽽是使⽤Node对象的⼦对象Element,Attr,Text等6.元素类Element是Node类最主要的⼦对象,在元素中可以包含属性,因⽽Element中有存取其属性的⽅法7.属性类Attr代表某个元素的属性,虽然Attr继承⾃Node接⼝,但因为Attr是包含在Element中的,但并不能将其看做是Element的⼦对象,因为Attr并不是DOM树的⼀部分基本的知识就到此结束,更加具体的⼤家可以参阅JDK API⽂档实战:1.使⽤DOM来遍历XML⽂档中的全部内容并且插⼊元素:school.xml⽂档:<?xml version = "1.0" encoding = "utf-8"?><School><Student><Name>沈浪</Name><Num>1006010022</Num><Classes>信管2</Classes><Address>浙江杭州3</Address><Tel>123456</Tel></Student><Student><Name>沈1</Name><Num>1006010033</Num><Classes>信管1</Classes><Address>浙江杭州4</Address><Tel>234567</Tel></Student><Student><Name>沈2</Name><Num>1006010044</Num><Classes>⽣⼯2</Classes><Address>浙江杭州1</Address><Tel>345678</Tel></Student><Student><Name>沈3</Name><Num>1006010055</Num><Classes>电⼦2</Classes><Address>浙江杭州2</Address><Tel>456789</Tel></Student></School>DomDemo.java1 package xidian.sl.dom;2import java.io.FileOutputStream;34import javax.xml.parsers.DocumentBuilder;5import javax.xml.parsers.DocumentBuilderFactory;67import org.apache.crimson.tree.XmlDocument;8import org.w3c.dom.Document;9import org.w3c.dom.Element;10import org.w3c.dom.NodeList;111213public class DomDemo {14/**15 * 遍历xml⽂档16 * */17public static void queryXml(){18try{19//得到DOM解析器的⼯⼚实例20 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();21//从DOM⼯⼚中获得DOM解析器22 DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();23//把要解析的xml⽂档读⼊DOM解析器24 Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");25 System.out.println("处理该⽂档的DomImplementation对象 = "+ doc.getImplementation());26//得到⽂档名称为Student的元素的节点列表27 NodeList nList = doc.getElementsByTagName("Student");28//遍历该集合,显⽰结合中的元素及其⼦元素的名字29for(int i = 0; i< nList.getLength() ; i ++){30 Element node = (Element)nList.item(i);31 System.out.println("Name: "+ node.getElementsByTagName("Name").item(0).getFirstChild().getNodeValue());32 System.out.println("Num: "+ node.getElementsByTagName("Num").item(0).getFirstChild().getNodeValue());33 System.out.println("Classes: "+ node.getElementsByTagName("Classes").item(0).getFirstChild().getNodeValue());34 System.out.println("Address: "+ node.getElementsByTagName("Address").item(0).getFirstChild().getNodeValue());35 System.out.println("Tel: "+ node.getElementsByTagName("Tel").item(0).getFirstChild().getNodeValue());36 }3738 }catch (Exception e) {39// TODO: handle exception40 e.printStackTrace();41 }42 }43/**44 * 向已存在的xml⽂件中插⼊元素45 * */46public static void insertXml(){47 Element school = null;48 Element student = null;49 Element name = null;50 Element num = null;51 Element classes = null;52 Element address = null;53 Element tel = null;54try{55//得到DOM解析器的⼯⼚实例56 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();57//从DOM⼯⼚中获得DOM解析器58 DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();59//把要解析的xml⽂档读⼊DOM解析器60 Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");61//得到⽂档名称为Student的元素的节点列表62 NodeList nList = doc.getElementsByTagName("School");63 school = (Element)nList.item(0);64//创建名称为Student的元素65 student = doc.createElement("Student");66//设置元素Student的属性值为23167 student.setAttribute("examId", "23");68//创建名称为Name的元素69 name = doc.createElement("Name");70//创建名称为⾹⾹的⽂本节点并作为⼦节点添加到name元素中71 name.appendChild(doc.createTextNode("⾹⾹"));72//将name⼦元素添加到student中73 student.appendChild(name);74/**75 * 下⾯的元素依次加⼊即可76 * */77 num = doc.createElement("Num");78 num.appendChild(doc.createTextNode("1006010066"));79 student.appendChild(num);8081 classes = doc.createElement("Classes");82 classes.appendChild(doc.createTextNode("眼视光5"));83 student.appendChild(classes);8485 address = doc.createElement("Address");86 address.appendChild(doc.createTextNode("浙江温州"));87 student.appendChild(address);8889 tel = doc.createElement("Tel");90 tel.appendChild(doc.createTextNode("123890"));91 student.appendChild(tel);9293//将student作为⼦元素添加到树的根节点school94 school.appendChild(student);95//将内存中的⽂档通过⽂件流⽣成insertSchool.xml,XmlDocument位于crison.jar下96 ((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/insertSchool.xml"));97 System.out.println("成功");98 }catch (Exception e) {99// TODO: handle exception100 e.printStackTrace();101 }102 }103public static void main(String[] args){104//读取105 DomDemo.queryXml();106//插⼊107 DomDemo.insertXml();108 }109 }110运⾏后结果:然后到⽬录下查看⽣成的xml⽂件:打开查看内容:上⾯添加元素后输出的⽂件与之前的⽂件不是同⼀个⽂件,如果需要输出到原⽂件中,那么只要将路径改为原⽂间路径即可:src/xidian/sl/dom/school.xml2.创建XML过程与插⼊过程相似,就是Document需要创建package xidian.sl.dom;import java.io.FileOutputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.apache.crimson.tree.XmlDocument;import org.w3c.dom.Document;import org.w3c.dom.Element;public class CreateNewDom {/*** 创建xml⽂档* */public static void createDom(){Document doc;Element school,student;Element name = null;Element num = null;Element classes = null;Element address = null;Element tel = null;try{//得到DOM解析器的⼯⼚实例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//从DOM⼯⼚中获得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//创建⽂档树模型对象doc = dbBuilder.newDocument();if(doc != null){//创建school元素school = doc.createElement("School");//创建student元素student = doc.createElement("Student");//设置元素Student的属性值为231student.setAttribute("examId", "23");//创建名称为Name的元素name = doc.createElement("Name");//创建名称为⾹⾹的⽂本节点并作为⼦节点添加到name元素中name.appendChild(doc.createTextNode("⾹⾹"));//将name⼦元素添加到student中student.appendChild(name);/*** 下⾯的元素依次加⼊即可* */num = doc.createElement("Num");num.appendChild(doc.createTextNode("1006010066"));student.appendChild(num);classes = doc.createElement("Classes");classes.appendChild(doc.createTextNode("眼视光5"));student.appendChild(classes);address = doc.createElement("Address");address.appendChild(doc.createTextNode("浙江温州"));student.appendChild(address);tel = doc.createElement("Tel");tel.appendChild(doc.createTextNode("123890"));student.appendChild(tel);//将student作为⼦元素添加到树的根节点schoolschool.appendChild(student);//添加到⽂档树中doc.appendChild(school);//将内存中的⽂档通过⽂件流⽣成insertSchool.xml,XmlDocument位于crison.jar下((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/createSchool.xml")); System.out.println("创建成功");}}catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}public static void main(String[] args) {CreateNewDom.createDom();}}运⾏结果:DOM的操作应该还是⾮常简单明了的,掌握了没哦。
java dom解析DOM解析器是一种用于解析XML文档的Java库。
它允许开发人员以结构化的方式访问和操作XML文件的数据。
DOM解析器将整个XML文档加载到内存中,并将其表示为一个树形结构,其中每个节点都对应着XML文档中的一个元素、属性或文本。
通过 DOM 解析器,我们可以轻松地遍历整个XML文档,提取所需的数据或修改文档的内容。
使用DOM解析器解析XML文档的基本步骤如下:1. 导入所需的Java类库:要使用DOM解析器,我们需要导入javax.xml.parsers包的相应类。
2. 创建一个XML解析器的工厂对象:通过调用javax.xml.parsers包中的DocumentBuilderFactory类的静态方法newInstance(),我们可以获取XML解析器的工厂对象。
3. 创建一个XML解析器对象:使用XML解析器的工厂对象的newDocumentBuilder()方法,我们可以创建一个XML解析器对象。
4. 解析XML文档:通过调用XML解析器对象的parse()方法,我们可以将XML文档加载到内存中并解析它。
解析结果将以一个Document对象的形式返回。
5. 获取节点信息:我们可以使用Document对象提供的方法来访问XML文档中的各个节点。
例如,可以使用getElementsByTagName()方法获取指定标签名的节点列表,使用getAttribute()方法获取节点的属性值,使用getTextContent()方法获取节点的文本内容等等。
6. 进行数据处理:一旦获取了所需的节点信息,我们可以根据具体需求对数据进行处理。
例如,可以将节点的属性值转换为Java对象,将节点的数据存储到数据库中,或者将节点的文本内容展示在用户界面上等等。
7. 释放资源:在处理完XML文档后,记得要释放DOM解析器的资源,可以调用Document对象的normalize()方法进行清理工作。
读写XML的四种方法XML(eXtensible Markup Language)是一种用于表示和传输数据的标记语言。
它具有良好的可读性和扩展性,被广泛应用于Web开发、数据交换和配置文件等领域。
在读写和处理XML数据时,有许多方法可供选择。
本文将介绍四种常见的读写XML的方法:DOM、SAX、JDOM、和XMLStreamReader/XMLStreamWriter。
1. DOM(Document Object Model):DOM是一种基于树形结构的解析器,它将整个XML文档加载到内存中,并将其表示为一个对象树。
在DOM中,每个XML元素都被表示为一个节点(Node),可以通过节点的属性和方法对其进行操作。
读取XML文档时,可以使用DOM解析器将其转换为一个DOM树,然后通过节点的方法访问和修改树结构。
写入XML文档时,可以通过创建和修改节点来构建DOM树,并使用DOM解析器将其保存为XML文档。
使用DOM读取XML文档的基本步骤如下:- 创建一个DocumentBuilderFactory对象。
- 根据DocumentBuilderFactory对象创建一个DocumentBuilder对象。
- 使用DocumentBuilder对象解析XML文档,并返回一个Document对象。
- 通过Document对象的方法遍历和操作XML文档的节点。
使用DOM写入XML文档的基本步骤如下:- 创建一个DocumentBuilderFactory对象。
- 根据DocumentBuilderFactory对象创建一个DocumentBuilder对象。
- 使用DocumentBuilder对象创建一个Document对象。
- 通过Document对象的方法创建和添加元素节点、属性节点等。
- 使用TransformerFactory和Transformer对象将Document对象保存为XML文档。
DOM的优点是易于使用和理解,可以方便地遍历和修改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(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(`方法,可以将新节点添加为现有节点的子节点。
c解析xml常用方法解析XML是指将XML文档中的数据提取与分析的过程。
XML是一种标记语言,用于描述数据的结构与内容。
常用的XML解析方法包括DOM、SAX和StAX。
DOM解析:DOM(Document Object Model)是一种将XML文档表示为文档树的解析方法。
DOM解析将整个XML文档加载到内存中,并构建一个树形结构,可以方便地对XML文档进行遍历和操作。
常用的DOM解析类包括DocumentBuilder和Document类。
1.创建DOM解析器:```javaDocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(;DocumentBuilder builder = factory.newDocumentBuilder(;```2.加载XML文档:```javaDocument document = builder.parse(new File("file.xml")); //通过文件Document document = builder.parse(inputStream); //通过输入流Document document = builder.parse(url); //通过URL```3.获取根节点:```javaElement rootElement = document.getDocumentElement(;```4.遍历子节点:```javaNodeList nodeList = rootElement.getChildNodes(;for (int i = 0; i < nodeList.getLength(; i++)Node node = nodeList.item(i);if (node.getNodeType( == Node.ELEMENT_NODE)Element element = (Element) node;//处理子节点}```SAX解析:SAX(Simple API for XML)是一种基于事件驱动的解析方法。