001 public class DOM_Parser {
002  
003     public static void main(String[] args) {
004         try {
005             String path = DOM_Parser.class.getClassLoader()
006                 .getResource("books.xml").getPath();
007              
008             // 获取文档对象
009             Document doc = getDocumentByPath(path);
010  
011             // 遍历文档对象树(加载xml文档在内存中形成的文档对象树)
012             // 获取xml文档根元素
013             Element root = doc.getDocumentElement();
014  
015             BookVO vo = new BookVO();
016             vo.setId("004");
017             vo.setName("JAVA未眠者");
018             // 创建一个新的book元素
019             createBookElement(doc, root, vo);
020  
021             // 遍历元素
022 //          iteratorElement(root);
023             iteratorElement2(root);
024  
025         catch (ParserConfigurationException e) {
026             e.printStackTrace();
027         catch (SAXException e) {
028             e.printStackTrace();
029         catch (IOException e) {
030             e.printStackTrace();
031         }
032     }
033  
034     /**
035      * 遍历元素
036      *
037      * @param ele
038      */
039     private static void iteratorElement(Element ele) {
040         // 获取根元素下子元素(book元素)
041         NodeList bookNodes = ele.getChildNodes();
042  
043         for (int i = 0; i < bookNodes.getLength(); i++) {
044             Node bookNode = bookNodes.item(i);
045             // 判断当前节点是否为元素节点
046             if (bookNode.getNodeType() == Node.ELEMENT_NODE) {
047                 Element childEle = (Element) bookNode;
048                 // 根据元素上的属性名获取到对应的属性值
049                 if (childEle.hasAttribute("id")) {
050                     System.out.print("id = " + childEle.getAttribute("id")
051                             " ");
052                     // 遍历book元素下的子元素
053                     iteratorElement(childEle);
054                 else {
055                     System.out.print(childEle.getNodeName() + " = "
056                             + childEle.getTextContent() + " ");
057  
058                     if ("author".equals(childEle.getNodeName())) {
059                         System.out.println();
060                     }
061                 }
062  
063             }
064         }
065     }
066      
067     /**
068      * 通过getElementsByTagName()方法遍历文档对象树中元素
069      *
070      * @param root
071      */
072     private static void iteratorElement2(Element root) {
073          //获取所有book元素节点
074         NodeList books = root.getElementsByTagName("book");
075         NodeList name = root.getElementsByTagName("name");
076         NodeList type = root.getElementsByTagName("type");
077         NodeList price = root.getElementsByTagName("price");
078         NodeList author = root.getElementsByTagName("author");
079          
080         for (int i = 0; i < books.getLength(); i++) {
081             Element bookEle = (Element)books.item(i);
082             System.out.print("id = " + bookEle.getAttribute("id"));
083              
084             Element nameEle = (Element)name.item(i);
085             System.out.print("  name = " + nameEle.getTextContent());
086             System.out.println();
087         }
088     }
089  
090     /**
091      * 创建新的book元素对象
092      *
093      * @param doc
094      * @param root
095      */
096     private static void createBookElement(Document doc, Element root, BookVO vo) {
097         // 向文档对象树上添加新book子元素
098         // 创建新的book元素
099         Element book = doc.createElement("book");
100         book.setAttribute("id", vo.getId());
101  
102         // 创建book元素下的子元素
103         Element name = doc.createElement("name");
104         name.setTextContent(vo.getName());
105         Element price = doc.createElement("price");
106         Element type = doc.createElement("type");
107         Element author = doc.createElement("author");
108  
109         // 构建元素之间层次关系
110         book.appendChild(name);
111         book.appendChild(price);
112         book.appendChild(type);
113         book.appendChild(author);
114  
115         root.appendChild(book);
116     }
117  
118     /**
119      * 根据xml文档路径,获取解析xml文档对应的文档对象
120      *
121      * @param path
122      * @return
123      * @throws ParserConfigurationException
124      * @throws SAXException
125      * @throws IOException
126      */
127     private static Document getDocumentByPath(String path)
128             throws ParserConfigurationException, SAXException, IOException {
129         // 获取DOM解析器工厂对象
130         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
131         // 获取DOM解析器对象
132         DocumentBuilder db = dbf.newDocumentBuilder();
133  
134         // 加载要解析xml文档
135         Document doc = db.parse(path);
136         return doc;
137     }
138 }

XML解析(DOM)的更多相关文章

  1. Android中XML解析-Dom解析

    Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以D ...

  2. XML 解析---dom解析和sax解析

    眼下XML解析的方法主要用两种: 1.dom解析:(Document Object Model.即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML ...

  3. XML解析——DOM解析

    XML:可扩展性标记语言,主要用来传输和存储数据,相对于HTML的各种标签规范,XML的标签可以让用户根据语义自己进行定义,适用于web传输. JSON和XML的区别: (1).XML定义 扩展标记语 ...

  4. Xml解析(Dom解析xml)

    xml四种解析方式: DOM 平台无关的官方解析方式 优点:形成了树结构,直观好理解,代码更易编写 解析过程中树结构保留在内存中,方便修改 缺点:当xml文件较大时,对内存耗费比较大,容易影响解析性能 ...

  5. XML解析之DOM详解及与SAX解析方法的比较

    XML解析(DOM) XML文件解析方法介绍 我们所用到的NSXMLParser是采用SAX方法解析 SAX(Simple API for XML) 只能读,不能修改,只能顺序访问,适合解析大型XML ...

  6. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  7. 使用XWAF框架(5)——XML解析器:CXDP

    XWAF推出了自己的组合式XML文档解析器,英文名叫:“CXDP”,是“Combined XML Document Parser”的缩写.核心代码属XWAF原创,注释.日志和帮助文档采用全中文描述,特 ...

  8. 用java操作XML文件(DOM解析方式)

    XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...

  9. 【Java】XML解析之DOM

    DOM介绍 DOM(Document Object Model)解析是官方提供的XML解析方式之一,使用时无需引入第三方包,代码编写简单,方便修改树结构,但是由于DOM解析时是将整个XML文件加载到内 ...

随机推荐

  1. css position是前端的你了解多少?

    此文根据Steven Bradley的<How Well Do You Understand CSS Positioning?>所译,整个译文带有我自己的理解与思想,如果译得不好或不对之处 ...

  2. jmeter给cookie设置sessionId避免其他脚本多次登录

    1.相关知识: http头部可以设置:浏览器显示内容类型,如content-type:text/html http头部可以存放:浏览器的cookie信息——cookie是对用户身份进行判断的内容 ht ...

  3. Leetcode 264.丑数II

    丑数II 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10 ...

  4. 公钥加密算法那些事 | RSA 与 ECC 系统对比

    一.背景 据记载,公元前 400 年,古希腊人发明了置换密码.1881 年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用「恩尼格玛」密码机,密码学在战争中起着非常重要的作用. 随着 ...

  5. BZOJ 1022: [SHOI2008]小约翰的游戏John【anti-SG】

    Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...

  6. 飞扬的小鸟(codevs 3729)

    题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便 ...

  7. P2835 刻录光盘

    洛谷—— P2835 刻录光盘 题目描述 在JSOI2005夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习.组委会觉得这个主意不错!可是组委会 ...

  8. Codeforces 920E(补图BFS)

    题意: n(n<=200000)个点的完全图删去了m(m<=200000)条边,求剩下图的连通分量. 分析: 将未访问过的点用一个链表串起来 仍旧进行BFS,每次BFS扩展一个点u的时候, ...

  9. 51nod 马拉松30 C(构二分图+状压dp)

    题意 分析 考虑一个图能被若干简单环覆盖,那么一定是每个点恰好一个出度,恰好一个出度 于是类似最小路径覆盖的处理,我们可以把每个点拆成2个点i和i',如果有一条边(i,j),那么将i和j'连起来 那么 ...

  10. HashCode和equal方法

    equals()反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. 而hashCode()是对象或变量通过哈希算法计算出的哈希值. 之所以有hashCode方 ...