用DOM方式解析XML
一、用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的更多相关文章
- 用JAXP的dom方式解析XML文件
用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...
- Dom方式解析XML
public class TestXML { public static void main(String[] args) throws SAXException, IOException { //D ...
- 在iOS 开发中用GDataXML(DOM方式)解析xml文件
因为GDataXML的内部实现是通过DOM方式解析的,而在iOS 开发中用DOM方式解析xml文件,这个时候我们需要开启DOM,因为ios 开发中是不会自动开启的,只有在mac 开发中才自动开启的.我 ...
- Java&Xml教程(二)使用DOM方式解析XML文件
DOM XML 解析方式是最容易理解的,它將XML文件作为Document对象读取到内存中,然后你可以轻松地遍历不同的元素和节点对象.遍历元素和节点不需要按照顺序进行. DOM解析方式适合尺寸较小的X ...
- Java眼中的XML--文件读取--1 应用DOM方式解析XML
初次邂逅XML: 需要解析的XML文件: 这里有两个book子节点. 1.如何进行XML文件解析前的准备工作,另外解析先获取book节点. 这个我后来看懂了: 这个Node的ELEMENT_NODE= ...
- Java-Web DOM方式解析xml文件
XML DOM 树形结构: DOM 节点 根据 DOM,XML 文档中的每个成分都是一个节点. DOM 是这样规定的: 整个文档是一个文档节点 每个 XML 元素是一个元素节点 包含在 XML 元素中 ...
- DOM方式解析xml实例2
老样子,javabean实体类: import java.io.*; public class Book implements Serializable { private int id; priva ...
- DOM方式解析XML文件实例
books.XML文件: <?xml version="1.0" encoding="utf-8"?><bookstore> &l ...
- Java DOM方式解析XML(模板)
//创建一个DocumentBuilderFactory工厂实例 DocumentBuilderFactory DBF=DocumentBuilderFactory.newInstance(); // ...
随机推荐
- sql语句实现行转列练习
create table STUDENT_SCORE( name VARCHAR2(20), subject VARCHAR2(20), score NUMBER(4,1));insert into ...
- Django url
urlpatterns = [ url(正则表达式, views视图函数,参数,别名),] 参数说明: 一个正则表达式字符串 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符 ...
- App专项测试之弱网测试
转载 https://blog.csdn.net/TestingGDR/article/details/83059415
- join,left join,inner join,full join的区别?
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...
- EXCEL文本字符串转日期
=IF(ISERROR(DATEVALUE(A2)), A2, DATEVALUE(A2)) 注意ISERROR函数的使用,如果DATEVALUE解析字符串失败,比如单元格数值本来就是日期,会发挥#V ...
- Pytorch_01 Tensor,Autograd,构建网络
Tensor Tensor是PyTorch中的重要数据结构,可认为是一个高维数组,Tensor与numpy的ndarrays类似,但Tensor可以使用GPU加速 import torch as t# ...
- JDBC数据库连接参数备忘
database driver url remark MySql com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/xxx mysql-connect ...
- cobbler登录web界面时出现“Internal Server Error”
当进行cobbler配置后,并进行web登录时,出现错误: 先查看其日志位置 #cat /etc/httpd/conf.d/ssl.conf 在其中位置发现其错误的日志位置为/etc/httpd/lo ...
- JAVA_maven 配置
前人种树: https://www.cnblogs.com/supiaopiao/p/7276805.html?utm_source=itdadao&utm_medium=referral
- jquery通过AJAX从后台获取信息并显示在表格上,并支持行选中
不想用Easyui的样式,但是想要他的表格功能,本来一开始是要到网上找相关插件的,但是没找到就开始自己写,没想到这么简单. 后台代码:(这个不重要) public ActionResult GetDi ...