工程名:TestReadXML

包名:com.siwuxie095.xml

类名:ReadXML.java

   

   

打开资源管理器,在工程 TestReadXML 文件夹下,放入

一个 XML 文件:languages.xml

   

languages.xml 的内容:

   

java 存取xml数据 java读取xml文件获取数据_3c

   

   

   

工程结构目录如下:

   

java 存取xml数据 java读取xml文件获取数据_java 存取xml数据_02

   

   

   

   

   

代码:

   



package com.siwuxie095.xml;
   
import java.io.File;
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;
   
public class ReadXML {
/**
 *  
 * 使用Java语言实现XML数据的解析
 * DOM方式解析
 *  
 * @param args 
 */ 
   
public staticvoid main(String[] args) {
 
//创建一个 DocumentBuilderFactory 对象,通过类调用静态方法获取一个新的实例
 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 
 
 
try {
 
//通过对象 factory 调用 newDocumentBuilder() 方法,创建一个新的 DocumentBuilder
//返回值是 DocumentBuilder 类型,创建对象,接收返回值
//有异常抛出,用 try catch 捕获
 DocumentBuilder builder=factory.newDocumentBuilder(); 
 
 
//使用 builder 来创建真正的XML文档
//使用 builder 的 parse()方法,传入文件对象,返回 Document 类型
//(这里是匿名对象,使用相对路径)
//创建一个 Document 对象来接收返回值
//(注意:使用 org.w3c.dom 包中的 Document 类)
//有异常抛出,用 try catch 捕获
new"languages.xml"));
 
 
//文档创建完成后,开始读取
//
//先读取根元素:languages,创建一个 Element 对象
//(注意:使用 org.w3c.dom 包中的 Element 类)
//getDocumentElement() 获取文档元素即文档根元素
 Element root=document.getDocumentElement(); 
//获取根元素的属性值
"category="+root.getAttribute("category"));
 
 
//接着读取根元素的子集元素:lan
//getElementsByTagName() 的返回值是 NodeList 类型,即一个集合
//创建一个 NodeList对象接收返回值
"lan");
 
 
//创建for循环,循环打印 lan 内部的值
//循环次数使用 NodeList 的 getLength() 方法
forint0; i < list.getLength(); i++) {
//创建一个 Element,调用list的item()方法,
//传入下标i,按照循环次数获取list中的内容
//但item()的返回值是Node类型,是Element的父类
//父类转子类,需要进行强制转换
 Element lan=(Element) list.item(i); 
 
 
//将 for循环中的元素分隔开
"-------------");
//获取属性值
"id="+lan.getAttribute("id"));
 
 
//获取 lan 中的两个子节点:
//name 和 ide,是两个不同的 TagName
//
//不建议使用下面的方法:
//可以使用getElementsByTagName(),但弊端是返回的是一个集合
//两个节点即两个集合,还要从两个集合中分别取第一个值
//(因为已知一个节点只有一项)
"name").item(0);
//获取当前节点中的文本内容(字符型数据)
//System.out.println("name="+name.getTextContent());
 
 
//获取 lan 中的两个子节点,因为lan下的子节点同级,建议使用:
//getChildNodes()方法,获取lan下的所有的子节点,
//返回值是 NodeList 类型,创建对象接收返回值
 NodeList clist=lan.getChildNodes(); 
forint0; j < clist.getLength(); j++) {
//这里和上面不一样,如果创建Element对象并强转,会报错:类型转换错误
 Node c=clist.item(j); 
 
 
//如果当前的节点是Element对象,才输出
//如果不判断,当前的API在打印时会把每一行后面的空白+回车、缩进符
//当做两个新节点,即获取节点时并不是只获取可见的节点,
//对于不可见的数据,同样要作为一个节点读取
ifinstanceof Element) {
//获取 name、ide 节点
"="+c.getTextContent());
 } 
 
 } 
 
 } 
 
 
catch (ParserConfigurationException e) {
 e.printStackTrace(); 
catch (SAXException e) {
 e.printStackTrace(); 
catch (IOException e) {
 e.printStackTrace(); 
 } 
 } 
   
}



   

   

运行一览:

   

加了if (c instanceof Element)判断:

   

java 存取xml数据 java读取xml文件获取数据_3c_03

   

   

   

不加if (c instanceof Element)判断:

   

java 存取xml数据 java读取xml文件获取数据_3c_04

   

   

   

   

   

   

   

【made by siwuxie095】