1、前言

DOM XML Parser简介

DOM 它是 W3C 处理 XML 规范 API,这是很多其他的 XML 地基处理相关标准,不仅是 Java,其他的,如 Javascript,PHP。MS .NET 等方面都达到了标准语言。用最为广泛的 XML 处理方式。当然,为了能提供很多其他更加强大的功能,Java 对于 DOM 直接扩展工具类有非常多,比方非常多 Java 程序猿耳熟能详的 JDOM。DOM4J 等等,它们基本上属于对 DOM 接口功能的扩充,保留了非常多 DOM API 的特性。很多原本的 DOM 程序猿甚至都没有不论什么障碍就熟练掌握了另外两者的使用,直观、易于操作的方式使它深受广大 Java 程序猿的喜爱。

DOM XML Parser优缺点

实现 W3C 标准,有多种编程语言支持这样的解析方式,而且这样的方法本身操作上简单快捷,十分易于刚開始学习的人掌握。其处理方式是将 XML 整个作为类似树结构的方式读入内存中以便操作及解析,因此支持应用程序对 XML 数据的内容和结构进行改动,可是同一时候因为其须要在处理開始时将整个 XML 文件读入到内存中去进行分析,因此其在解析大数据量的 XML 文件时会遇到类似于内存泄露以及程序崩溃的风险,请对这点多加注意。

适用范围:小型 XML 文件解析、须要全解析或者大部分解析 XML、须要改动 XML 树内容以生成自己的对象模型

2、XML DOM节点树

XML DOM将XML文档作为树结构,树结构称为一个节点树。全部的节点能够通过树訪问,它们的内容能够被改动或删除,也能够建立新的元素。节点树用于显示节点集和它们之间的联系。

下图呈现的是books.XML文件的节点树。

经常使用的几个对象:

1)Element类:

是Node类最基本的子对象。被广泛使用,在元素中能够包括属性。因而Element中有存取其属性的方法。

2)Node类:

Node对象是DOM中最主要的对象,代表了文档树中的抽象节点。但在实际使用中非常少会直接使用Node对象。而是使用Node对象的子对象Element,Attr,Text等。

3)NodeList类:

代表了一个包括一个或者多个Node的列表,依据操作能够将其简化的看做为数组。

3、DOM XML Parser 解析XML文件

以下给出一段用于解析的 books.xml片段:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Edited by XMLSpy -->
<bookstore><book category="cooking"><title lang="en">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><book category="children"><title lang="en">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book><book category="web"><title lang="en">XQuery Kick Start</title><author>James McGovern</author><author>Per Bothner</author><author>Kurt Cagle</author><author>James Linn</author><author>Vaidyanathan Nagarajan</author><year>2003</year><price>49.99</price></book><book category="web" cover="paperback"><title lang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book>
</bookstore>

Book.java:该对象是一个实体Bean,其字段信息相应着xml文件中的元素字段,因为篇幅有限,读者自行生成get、set方法 。

package com.andieguo.xmldemo;public class Book {private String category;private String titleLang;private String title;private String author;private Integer year;private Double price;@Overridepublic String toString() {return "Book [category=" + category + ", titleLang=" + titleLang + ", title=" + title + ", author=" + author + ", year=" + year + ", price=" + price + "]";}//生成字段的get、set方法
}

ReadXMLFile.java :解析XML文件并存入List<Book>集合。

package com.andieguo.xmldemo;import java.io.File;
import java.util.ArrayList;
import java.util.List;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;public class ReadXMLFile {public static void main(String[] args) {File file = new File("src/com/andieguo/xmldemo/books.xml");//books.xml文件应放在和ReadXMLFile.java同级的目录下List<Book> books = readXMLFile(file);for (Book book : books) {System.out.println(book.toString());}}public static List<Book> readXMLFile(File file) {List<Book> lists = new ArrayList<Book>();try {DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(file);NodeList bookList = doc.getElementsByTagName("book");for (int i = 0; i < bookList.getLength(); i++) {Node bookNode = bookList.item(i);if (bookNode.getNodeType() == Node.ELEMENT_NODE) {Element bookElement = (Element) bookNode;Book book = new Book();book.setCategory(bookElement.getAttribute("category"));Element titleElement = (Element) bookElement.getElementsByTagName("title").item(0);book.setTitle(titleElement.getTextContent());book.setTitleLang(titleElement.getAttribute("lang"));NodeList authorList = bookElement.getElementsByTagName("author");String author = "";for (int j = 0; j < authorList.getLength(); j++) {author = author + authorList.item(j).getTextContent() + "/";}author = author.substring(0, author.length() - 1);book.setAuthor(author);book.setYear(Integer.valueOf(bookElement.getElementsByTagName("year").item(0).getTextContent()));book.setPrice(Double.valueOf(bookElement.getElementsByTagName("price").item(0).getTextContent()));lists.add(book);}}} catch (Exception e) {e.printStackTrace();}return lists;}
}

执行程序后的效果图:

4、DOM XML Parser 遍历XML文件

LoopXMLFile.java:通过迭代遍历xml文件
package com.andieguo.xmldemo;import java.io.File;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;public class LoopXMLFile {public static void main(String[] args) {loopXMLFile();}private static void loopXMLFile(){try {File file = new File("src/com/andieguo/xmldemo/books.xml");DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(file);if(doc.hasChildNodes()){printNote(doc.getChildNodes());}} catch (Exception e) {e.printStackTrace();}}private static void printNote(NodeList nodeList){for(int i=0; i<nodeList.getLength();i++){Node node = nodeList.item(i);if(node.getNodeType() == Node.ELEMENT_NODE){System.out.println("<"+node.getNodeName()+">");System.out.println(node.getTextContent());if(node.hasAttributes()){NamedNodeMap nodeMap = node.getAttributes();for(int j=0;j<nodeMap.getLength();j++){Node nd = nodeMap.item(j);System.out.println(nd.getNodeName()+"="+nd.getNodeValue());}}if(node.hasChildNodes()){printNote(node.getChildNodes());}System.out.println("<" + node.getNodeName() + "/>");}}}
}

5、DOM XML Parser 创建XML文件

CreateXMLFile.java:

将集合List<Book>中的数据填充构建的XML文件里,读者可结合第2节 XML DOM树图来理解整个XML文件节点的生成、加入构建过程。

特别注意:

对于XML文件里的元素<year>2500</year>而言。2500不是<year>元素的值,而是<year>元素的一个TextNode节点。所以才有year.appendChild(doc.createTextNode(books.get(i).getYear().toString()));这种语句存在。

package com.andieguo.xmldemo;import java.io.File;
import java.util.List;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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;public class CreateXMLFile {public static void main(String[] args) {File file = new File("src/com/andieguo/xmldemo/books.xml");//books.xml文件应放在和CreateXMLFile.java同级的目录下List<Book> books = ReadXMLFile.readXMLFile(file);createXMLFile(books);}public static void createXMLFile(List<Book> books) {Document doc;Element bookstore;Element book;Element title;Element author;Element year;Element price;try {// 得到DOM解析器的工厂实例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();// 从DOM工厂中获得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();// 创建文档树模型对象doc = dbBuilder.newDocument();if (doc != null) {bookstore = doc.createElement("bookstore");for (int i = 0; i < books.size(); i++) {book = doc.createElement("book");//设置元素book的属性值book.setAttribute("category", books.get(i).getCategory());//创建名称为title的元素title = doc.createElement("title");//创建文本节点并作为子节点加入到title元素中title.appendChild(doc.createTextNode(books.get(i).getTitle()));//设置元素title的属性值title.setAttribute("lang", books.get(i).getTitleLang());//将title子元素加入到book中book.appendChild(title);String[] strAuthor = books.get(i).getAuthor().split("/");for(int j=0;j<strAuthor.length;j++){author = doc.createElement("author");author.appendChild(doc.createTextNode(strAuthor[j]));book.appendChild(author);//将多个author子元素加入到book中}year = doc.createElement("year");year.appendChild(doc.createTextNode(books.get(i).getYear().toString()));book.appendChild(year);//将year子元素加入到book中price = doc.createElement("price");price.appendChild(doc.createTextNode(books.get(i).getPrice().toString()));book.appendChild(price);//将price子元素加入到book中bookstore.appendChild(book); //将book作为子元素加入到树的根节点bookstore}doc.appendChild(bookstore);//加入到文档树中TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();DOMSource source = new DOMSource(doc);StreamResult result = new StreamResult(new File("src/com/andieguo/xmldemo/createbooks.xml"));transformer.transform(source, result);}} catch (Exception e) {e.printStackTrace();}}
}

执行程序后的效果图:

參考:

Java 处理 XML 的三种主流技术及介绍

http://www.ibm.com/developerworks/cn/xml/dm-1208gub/

XML DOM Node Tree

http://www.w3schools.com/dom/dom_nodetree.asp

How To Read XML File In Java – (DOM Parser)

http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

How To Create XML File In Java – (DOMParser)

http://www.mkyong.com/java/how-to-create-xml-file-in-java-dom/

org.w3c.dom(java dom)解析XML文档

http://www.cnblogs.com/shenliang123/archive/2012/05/11/2495252.html

友情提示:

转载请注明出处http://blog.csdn.net/andie_guo/article/details/24844351 。谢略。

版权声明:本文博主原创文章。博客,未经同意不得转载。

【Java规划】DOM XML Parser分解、遍历、创XML相关推荐

  1. 信息树和XML文件的遍历及XML文件的应用

    function Save() { //将INfomationTree中的不是Http开头的组,保存到本地,然后再从本地上传到服务器端 var IInformationTree = document. ...

  2. java 递归遍历对象所有属性_Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性...

    xml中加入了几条,为了方便查询时作为示例. 话不多说见代码注释: DTD文件:SwordTypeDefinition.dtd XML文件:SwordLib.xml SwordLibrary SYST ...

  3. java编写大数据分析模型_如何用Java(DOM分析器)编写XML文件

    java编写大数据分析模型 Earlier we learned how to read XML file and how to edit XML file in java using DOM Par ...

  4. Java使用DOM和DOM4J分别解析XML文件步骤以及代码

    XML文件如下: PhoneType.xml <?xml version="1.0" encoding="UTF-8" standalone=" ...

  5. java递归遍历xml所有元素_Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性...

    2019独角兽企业重金招聘Python工程师标准>>> xml中加入了几条,为了方便查询时作为示例. 话不多说见代码注释: DTD文件:SwordTypeDefinition.dtd ...

  6. java中DOM解析xml文件

    本文介绍了如何利用DOM(即Document Object Model文档对象模型)解析xml文件. 首先有一个xml文件: <?xml version=\"1.0\" en ...

  7. Java基础加强重温_13:XML(可拓展标记语言)、XML语法、XML约束、XML解析(Dom4j,JAXP)、Dom4j基本使用、Xpath表达式(XML路径语言)、XML解析综合案例

    摘要 Java基础加强重温_13: XML(可拓展标记语言.作用:小型数据库.框架配置文件.不同平台数据交换). XML语法(文档.标签/元素.属性.注释.转义字符.CDTA区) XML约束(DTD约 ...

  8. java xml stax_java XML -- SAX和StAX分析XML

    Java与XML 之 SAX和StAX 本文由大关收集整理所得,不保证内容的正确性,转载请标明出处,谢谢! 上一次,我们讲述了使用Dom方式解析XML,并通过修改Dom树结构,最终改变XML文档内容. ...

  9. python读取xml标注坐标_遍历文件 创建XML对象 方法 python解析XML文件 提取坐标计存入文件...

    XML文件??? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 里面的标签都是可以随心所欲的按照他的命名规则来定义的,文件名为roi.xm ...

最新文章

  1. 求两个数的最大公因数
  2. c语言吧百度贴吧经典100例,C语言程序设计经典100例
  3. 一道比较实用的MySQL面试题:游戏数据充值查询
  4. AndroidStudio离线使用gradle
  5. java 登录下线_java web中Listener的实现(实现用户在线统计数量和强制用户下线)...
  6. 【windows7】解决IIS 80端口占用问题(亲测)
  7. Python 析构方法__del__
  8. Spring的使用——基础环境搭建以及IOC概念理解(持续更新)
  9. nginx php 协同工作,nginx和php之间工作原理
  10. 中科大计算机考研科学岛,科学岛研究生_请问谁知道研究生去合肥科学岛与在学校的利与弊啊着急!!!!_淘题吧...
  11. 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示。
  12. Open XML应用安全(3)隐藏数据
  13. 将 Ps 的调色效果保存为预设文件
  14. Intellij IDEA中拉svn分支
  15. Hadoop四大组件介绍
  16. 如何在matlab中画二元函数的图像,Matlab画怎么画这个二元函数图像
  17. 计算机说课稿模板小学数学,小学数学说课万能模板精简
  18. 如何根据论文文章名称一键查询该篇论文的引用格式?
  19. 生物信息常用文件格式
  20. Html id 选择器

热门文章

  1. mui 使用LocalStore记住用户密码方法
  2. python torch exp_Python:PyTorch 保存和加载训练过的网络 (八十)
  3. java怎么监听多个组件,java web(五):java web三大组件之另外两个和八大监听器
  4. 实时流处理系统容错机制(二):Apache Flink 基于State的异步容错机制
  5. 怎么实现事务_你可能知道事务的四大特性,但是不一定知道“事务的实现原理”...
  6. java关闭inputstream_关闭Java InputStreams
  7. Docker之docker简介及其优势
  8. python day29
  9. javamail 收邮件并解析附件
  10. 【Android-功能】Android应用增量更新