一、用DOM方式解析XML

此例子节点结构如下:

1、获取book节点属性

(1).如果不知道节点的属性,通过 NamedNodeMap attrs = book.getAttributes(); 来获取属性的集合(蓝色部分代码)

(2)、如果知道book节点有且只有一个id属性,则用

  Element book = (Element)bookList.item(i);
  String attrValue = book.getAttribute("id");

  来遍历属性,将蓝色部分替换为黄色部分

import java.io.IOException;
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.NodeList;
import org.xml.sax.SAXException; public class DomTest { public static void main(String[] args) {
//1.创建一个DocumentBuilderFactory对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//2.创建一个DocumentBuilder对象
try {
//3.创建一个Document对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//4.通过Document对象的perse方法加载book。xml文件到当前项目下
Document document = documentBuilder.parse("book.xml");
//获取book结点的集合
NodeList bookList = document.getElementsByTagName("book");
//遍历每一个book节点
//获取bookLength()长度
System.out.println("共有" + bookList.getLength() + "本书");
for(int i = 0;i < bookList.getLength();i++) {
System.out.println("现在开始遍历第" + (i + 1) + "本书---");
//通过item(i)获取book节点,下标从0开始
Node book = bookList.item(i);
//获取book属性集合
NamedNodeMap attrs = book.getAttributes();
//遍历book属性
System.out.println("第" + (i + 1) + "本书共有" + attrs.getLength()+ "个属性");
for(int j = 0;j < attrs.getLength();j++) {
//通过item()获取属性
Node attr = attrs.item(j);
System.out.print("属性名" + attr.getNodeName());
System.out.println(" 属性值" + attr.getNodeValue());
}
                Element book = (Element)bookList.item(i);
String attrValue = book.getAttribute("id");
System.out.println(attrValue);
                System.out.println("第" + (i + 1) + "本书遍历完毕");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

3、遍历book的子节点的属性

(1)、用 NodeList childNodes = book.getChildNodes(); 来获取子节点的属性

(2)、用 getValue()不能得到子节点值, 因为Element类型getValue()返回null

(3)、用 childNodes.item(k).getFirstChild().getNodeValue() 可以得不到子节点的值(蓝色部分)

(4)、用 childNodes.item(k).getTextContent() 可以得到子节点的值(黄色部分)

public class DomTest {

    public static void main(String[] args) {
//1.创建一个DocumentBuilderFactory对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//2.创建一个DocumentBuilder对象
try {
//3.创建一个Document对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//4.通过Document对象的perse方法加载book。xml文件到当前项目下
Document document = documentBuilder.parse("book.xml");
//获取book结点的集合
NodeList bookList = document.getElementsByTagName("book");
//遍历每一个book节点
//获取bookLength()长度
System.out.println("共有" + bookList.getLength() + "本书");
for(int i = 0;i < bookList.getLength();i++) {
System.out.println("------------现在开始遍历第" + (i + 1) + "本书---------");
//通过item(i)获取book节点,下标从0开始
Node book = bookList.item(i);
//获取book属性集合
NamedNodeMap attrs = book.getAttributes();
//遍历book属性
System.out.println("第" + (i + 1) + "本书共有" + attrs.getLength()+ "个属性");
for(int j = 0;j < attrs.getLength();j++) {
//通过item()获取属性
Node attr = attrs.item(j);
System.out.print("属性名" + attr.getNodeName());
System.out.println(" 属性值" + attr.getNodeValue());
}
NodeList childNodes = book.getChildNodes();
//遍历childNodes获取节点名和结点值
System.out.println("第" + (i + 1) + "本书共有" +
childNodes.getLength() + "个子节点");
for(int k = 0;k < childNodes.getLength();k++) {
//区分text类型的Node和Element类型的Node
if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
//获取Element节点名和节点名
System.out.print("第" + (k + 1) + "个节点的节点名是" +
childNodes.item(k).getNodeName());
System.out.println("----节点的节点值是" +
childNodes.item(k).getFirstChild().getNodeValue());
System.out.println("----节点的节点值是" +
childNodes.item(k).getTextContent());
}
}
System.out.println("------------第" + (i + 1) + "本书遍历完毕-------------");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

(5)、如果节点变成这样

加上一个节点,childNodes.item(k).getFirstChild().getNodeValue() 返回的是null,不是节点值,此时getFirstChild为<aaa>节点,Element类型。

而 childNodes.item(k).getTextContent() 返回的正常的子节点值

小白一枚,还有不懂得地方:加上<aaa>节点之后getFirstChild().getNodeValue() 为什么返回不了“ADD”呢?

欢迎批评指正,谢谢。

用DOM方式解析XML的更多相关文章

  1. 用JAXP的dom方式解析XML文件

    用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...

  2. Dom方式解析XML

    public class TestXML { public static void main(String[] args) throws SAXException, IOException { //D ...

  3. 在iOS 开发中用GDataXML(DOM方式)解析xml文件

    因为GDataXML的内部实现是通过DOM方式解析的,而在iOS 开发中用DOM方式解析xml文件,这个时候我们需要开启DOM,因为ios 开发中是不会自动开启的,只有在mac 开发中才自动开启的.我 ...

  4. Java&Xml教程(二)使用DOM方式解析XML文件

    DOM XML 解析方式是最容易理解的,它將XML文件作为Document对象读取到内存中,然后你可以轻松地遍历不同的元素和节点对象.遍历元素和节点不需要按照顺序进行. DOM解析方式适合尺寸较小的X ...

  5. Java眼中的XML--文件读取--1 应用DOM方式解析XML

    初次邂逅XML: 需要解析的XML文件: 这里有两个book子节点. 1.如何进行XML文件解析前的准备工作,另外解析先获取book节点. 这个我后来看懂了: 这个Node的ELEMENT_NODE= ...

  6. Java-Web DOM方式解析xml文件

    XML DOM 树形结构: DOM 节点 根据 DOM,XML 文档中的每个成分都是一个节点. DOM 是这样规定的: 整个文档是一个文档节点 每个 XML 元素是一个元素节点 包含在 XML 元素中 ...

  7. DOM方式解析xml实例2

    老样子,javabean实体类: import java.io.*; public class Book implements Serializable { private int id; priva ...

  8. DOM方式解析XML文件实例

    books.XML文件: <?xml version="1.0" encoding="utf-8"?><bookstore>    &l ...

  9. Java DOM方式解析XML(模板)

    //创建一个DocumentBuilderFactory工厂实例 DocumentBuilderFactory DBF=DocumentBuilderFactory.newInstance(); // ...

随机推荐

  1. S表示1,L表示2,计算由S和L组成的序列之和为N的组合

    def func(n): def calc_str(s): s = s.strip() if s is not None else "" s = s.upper() result ...

  2. chrome 如何开启网页另存为.mhtml 功能

    打开chrome浏览器,输入地址:chrome://flags/   找到将网页另存为MHTML,点击启用就可以了. 或者直接输入:chrome://flags/#save-page-as-mhtml

  3. Vue stage3

    <body> <div id="box1"> <div v-bind:class="{ 'active': isActive, 'error ...

  4. 面试常问MySQL性能优化问题

    知识综述: [1] MySQL中锁的种类: 常见的表锁和行锁,也有Metadata Lock等等,表锁是对一整张表加锁,分为读锁和写锁,因为是锁住整张表,所以会导致并发能力下降,一般是做ddl处理时使 ...

  5. 聊聊 HashMap

    数据存储底层? 数据底层具体存储是一个Node<K,V> HashMap 是基于哈希来映射的,那当映射冲突时候怎么解决? 链地址,数组+链表 HashMap 什么时候扩容? 负载因子 lo ...

  6. jquery 事件的触发与绑定

    bind事件绑定: live事件绑定: hover事件绑定: one事件绑定 toggle事件绑定:

  7. 前端(HTML)初始

    一.用socket实现HTML的原理 import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() while ...

  8. python day10 函数(第二篇)

    2019.4.10 S21 day10笔记总结 一.内容回顾 1.面试题相关: 1.py2和py3的区别 2.运算符的计算 :3 or 9 and 8 3.字符串的反转 4.is和==的区别 5.v1 ...

  9. js解决下拉列表框互斥选项的问题

    如图不区分选项与其他选项是互斥的关系,当选择了不区分时,其他选项就要去除,当有其他选项存在时,就不能有不区分 解决办法:定义change事件,若列表发生改变,首先判断点击的是否是不区分,若是,则将其他 ...

  10. linux重装rabbitmq的问题

    一.卸载 [root@zabbix_server lib]# rpm -qa|grep rabbitmq rabbitmq-server--.noarch [root@zabbix_server li ...