原来一切都是有套路的

使用DOM解析XML文档步骤

1、创建解析器工厂对象 DocumentBuildFactory对象

2、由解析器工厂对象创建解析器对象,即DocumentBuilder对象

3、由解析器对象对指定XML文件进行解析,构建相应的DOM树,创建Document对象,生成一个Document对象

4、以Document对象为起点对DOM树的节点进行查询

5、使用Document的getElementsByTagName方法获取元素名称,生成一个NodeList集合,

6、遍历集合

实例代码如下:

package d0620;

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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; /*
* 解析phones.xml文件
*/
public class ParseXML {
public static void main(String[] arg){
//1、创建解析器工厂对象 DocumentBuildFactory对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=null;
Document dom=null;
try {
//2、由解析器工厂对象创建解析器对象,即DocumentBuilder对象
db=dbf.newDocumentBuilder();
//3、由解析器对象对指定XML文件进行解析,构建相应的DOM树,创建Document对象,生成一个Document对象
dom=db.parse("phones.xml");
//4、以Document对象为起点对DOM树的节点进行查询
//得到所有brand节点信息,是个集合
/*
* getElementsByTagName(String tagname)
按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList。
*/
NodeList brandlist=dom.getElementsByTagName("Brand");
//遍历所有brand
for(int i=0;i<brandlist.getLength();i++){
Node brand=brandlist.item(i);
//转成元素,获取brand的元素值
Element brandelement=(Element)brand;
String brandname=brandelement.getAttribute("name");
System.out.println(brandname);
//查找Type
NodeList typelist=brandelement.getChildNodes();
for(int j=0;j<typelist.getLength();j++){
Node typenode=typelist.item(j);
if(typelist.item(j) instanceof Element){
Element typename=(Element)typenode;
String typen=typename.getAttribute("name");
System.out.println("\t"+typen);
} }
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
System.out.println("解析结束");
} }
}

特别注意:

 if(typelist.item(j) instanceof Element){
Element typename=(Element)typenode;
String typen=typename.getAttribute("name");
System.out.println("\t"+typen);
}

如果不加判断,读取子节点时候,会把第一个和第二个和下一个换行的一些空格当作文本来处理,强制转换就会出错

Exception in thread "main" java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredTextImpl cannot be cast to org.w3c.dom.Element
    at d0620.ParseXML.main(ParseXML.java:47)

最新文章

  1. bzoj 4003
  2. MySQL 日期时间相关函数整理
  3. ImageView
  4. svn 忽略文件不管用
  5. Web软件安全攻击
  6. mysqldump导出部分数据的方法: 加入--where参数
  7. 基本的MFC多线程
  8. 【bzoj3771】【xsy1728】Triple
  9. WPF中利用DynamicDataDisplay快速实现示波器功能
  10. IOS文件操作的两种方式:NSFileManager操作和流操作
  11. 从用python做zoj1011发生Non-zero Exit Code错误说起
  12. 妙味课堂:JavaScript初级--第11课:字符串、查找高亮显示
  13. nyoj 过河问题
  14. java在cmd下编译引用第三方jar包
  15. iptables和netfilter
  16. Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡
  17. Spring Boot 起步
  18. [Flex+JAVA]建立Flex+java项目,并实现基本功能
  19. [转]IOS 崩溃日志分析
  20. cp命令详解

热门文章

  1. 网游中的网络编程系列1:UDP vs. TCP
  2. .net程序员转行做手游开发经历(一)
  3. 一些实用的sublime快捷键以及初始设置
  4. css+div 浮动分块
  5. Jquery-EasyUI学习2~
  6. 枚举型Enum和结构型Stuct
  7. extJs学习基础5 理解mvvm的一个小案例
  8. JPA Hibernate应用实例
  9. Django-Model 使用
  10. 【BZOJ 3050】【USACO2013 Jan】Seating 线段树