一、用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. eclipse的常用设置(空间新建后需要的配置)

    地址:https://blog.csdn.net/qiaorui_/article/details/78424491 说明:              新下载的eclipse或者新建了一个工作空间,之 ...

  2. uva-108-贪心

    题意: 求二维数组中子数组中的最大和. 使用二维数组,第i行表示前i行的和.那么a[i-j]表示从j行到i行的和.注意第三层循环,每次都保存当前最大的sum,如果sum小于0,直接置0. #inclu ...

  3. spring boot 拦截异常 统一处理

    spring boot 默认情况下会映射到 /error 进行异常处理,提示不友好,需要自定义异常处理,提供友好展示 1.自定义异常类(spring 对于 RuntimeException 异常才会进 ...

  4. 学习excel的使用技巧统计文本出现的次数

    其实是使用一个函数来完成的 =ifcount(C1:C214,''test123") 统计c1到c214中出现的test123的次数

  5. Maven 错误 :The POM for com.xxx:jar:0.0.1-SNAPSHOT is invalid, transitive dependencies (if any) will not be available

    一个大的maven 项目,结构是一个根pom,下面几个小的module,包括了appservice-darc,appservice-entity等,其中appservice-darc 依赖了 apps ...

  6. 基于MPI的大规模矩阵乘法问题

    转载请注明出处. /* Function:C++实现并行矩阵乘法; Time: 19/03/25; Writer:ZhiHong Cc; */ 运行方法:切到工程文件x64\Debug文件下,打开命令 ...

  7. wdcp lanmp 安装+搭建网站+安全狗安装 详细实用

    先说一下WDCP,其实就是一个集成环境,优点是有后台可视化面板操作,不像一般的linux似的 都要用代码命令! Linux 的PHP 环境一般就是两个搭配 [mysql+Apache+PHP]和[My ...

  8. React-Native: bios打开VT-x选项

    问题: 我在Android Studio新建一个虚拟机的时候出现如图错误: 解决方案:重启电脑,开机的时候不停的按f12(不同的主机不一样),进入bios,然后打开Virtualization Tec ...

  9. CentOS6.3上搭建expect无交互开发环境

    1.背景 在面向shell编程时对于需要交互的场合则必须通过人工来干预,而对于这种方式是违反无人职守的原则:现在expect就解决了这个问题, Expect是一个免费的编程工具语言,用来实现自动和交互 ...

  10. 想拥有自己的Python程序包,你只需15步

    来源商业新知网,原标题:15步,你就能拥有自己的Python程序包 全文共 3192 字,预计学习时长 6 分钟 每个软件开发员和数据科学家都难免要做程序包.本文推荐一篇 Python开源程序包的制作 ...