一、用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. POJ_1321

    题目   在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆 ...

  2. opencv常用api

    opencv常用api 一.图像及视频读写 img=cv2.imread('jiang.jpg',1)    cv2.imwrite('jiang.jpg',img)   cv2.imshow('ji ...

  3. 2018-2019-2 网络对抗技术 20165304 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165304 Exp6 信息搜集与漏洞扫描 原理与实践说明 1.实践原理 信息搜集:渗透测试中首先要做的重要事项之一,搜集关于目标机器的一切信息 间接收集 D ...

  4. 基于WCF的支持跨局域网可断点续传的大文件传输服务实现

    题外话:这个系列的文章记录了本人最近写的一个小工程,主要包含了两个功能,一是对文件的断点续传的功能,二是基于WCF的一对多文件主动发送的功能,顺便这也是我自己在WCF学习路上的一个小成果吧. 在网上找 ...

  5. 如果测试UI

    1. 先分享几个链接 https://www.ranorex.com/resources/testing-wiki/gui-testing/ https://www.tutorialspoint.co ...

  6. Spring再接触 Annotation part1

    使用annotation首先得加这两条代码 beans.xml <?xml version="1.0" encoding="UTF-8"?> < ...

  7. 【C++】C++中int与string的相互转换

    一.int转string 1.c++11标准增加了全局函数std::to_string: string to_string (int val); string to_string (long val) ...

  8. vue2.0的初始化

    vue2.0的初始化,使用 webpack构建工具生成的项目 直接上代码 main.js文件 // The Vue build version to load with the `import` co ...

  9. python之元组及其方法---整理集

    元组: 区别:与列表类似,是对列表的二次加工:用小括号包括起来:元素不可修改:不可增加.删除 技巧:创建元组的时候,一般在最后一个元素后面加一个逗号:为了与方法区分:并且这个逗号不算元素例如: tu= ...

  10. C# 自制报表组件 EzReportBuild 2.0

    组件无闪烁.画面流畅,效率一般,支持SQL和ACCESS两种.可以完成报表设计.预览.打印等功能,提供接口函数,可以将设计.预览等嵌入到自定的winform中调用,使用简单.每份报表可设置多页,每页可 ...