一、用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. 用matplotlib.pyplot画简单的折线图,直方图,散点图

    #coding=utf-8 """ 用matplotlib.pyplot画简单的折线图,直方图,散点图 """ import matplot ...

  2. Hive随机取某几行数据

    order by rand() limit 100 1. 可用于普通随机筛选 2. 也可用于row_number() 等函数的排序里作为随机排序.

  3. 质心坐标(barycentric coordinates)及其应用

    一.什么是质心坐标? 在几何结构中,质心坐标是指图形中的点相对各顶点的位置. 以图1的线段 AB 为例,点 P 位于线段 AB 之间, 图1 线段AB和点P 此时计算点 P 的公式为 . 同理,在三角 ...

  4. asp.net 微信开发(一)

    在准备工作中,我们已经完成准备工作,接下来就是进行开发啦,应该怎么来开发呢??容我想想...我觉得我们可以直接让用户的消息发送到微信的消息,转到我们自己的服务器上面!!感觉好厉害的样子 1.首先写 验 ...

  5. Java学习之代码块(静态,构造代码块,构造方法)执行顺序

    静态代码块   static{ 代码 } 随着类的加载而加载,随类的消失而消失,存在于类中,方法外,最先执行,且只加载1次,可用来加载驱动及初始化对象属性. 构造代码块   {   } 也存在于类中, ...

  6. Zabbix监控中,使用的比较好的动作信息模板

    https://www.cnblogs.com/songxingzhu/p/7299377.html 故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NA ...

  7. 深度学习原理与框架- batch_normalize(归一化操作)

    1. batch_normalize(归一化操作),公式:传统的归一化公式 (number - mean) / std, mean表示均值, std表示标准差 而此时的公式是 scale * (num ...

  8. airflow笔记

    airflow webserver --debug &  # debug 模式,在后台启动webserver airflow list_dags airflow list_tasks tuto ...

  9. JavaScript:我总结的数组API

    栈/队列 数组es3: pop删除最后一项(栈) shift删除第一项(队列) push增加到最后(栈) unshift增加到最前(队列) reverse翻转 join转字符串 slice截取(切片) ...

  10. linux上部署jenkins步骤小记

    一.部署jdk环境 1.下载jdk包,解压,放在选定的位置,我本次jdk包放置在“/usr/local/java/jdk” 目录下 2.配置环境变量 1)打开/etc/profile文件,在命令框中输 ...