本文对 Java Dom 解析 XML 文件进行了一次梳理,包含所使用测试的 XML 文件 .JAVA 文件
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1.Test.java
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
DomUtils utils = new DomUtils();
try {
ArrayList<Book> books = utils.readFromXML(new FileInputStream(
"D:\\book.xml"));
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
for (int i = 0; i < books.size(); i++) {
System.out.println("id:" + books.get(i).getId() + "name:"
+ books.get(i).getBookName() + "price:"
+ books.get(i).getBookPrice()+books.get(i).getTest());
}
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2.DomUtils.java
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
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 DomUtils {
public ArrayList<Book> readFromXML(InputStream inputStream) {
ArrayList<Book> list = new ArrayList<Book>();
// 创建 DocumentBuilderFactory 对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
// 从 DoccumentBuilderFactory 对象中获取一个 DocumentBuilder 对象
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
System.out.println("读取失败,不能正常获取 DocumentBuilder");
System.exit(1);// 0 表示正常退出 1表示异常退出
}
Document document = null;
// 使用 DocumentBulider 对象将 XML 文件输入流转化为一个 Document 对象
try {
document = builder.parse(inputStream);
} catch (Exception e) {
e.printStackTrace();
System.out.println("读取失败,不能正常获取 Document ");
System.exit(1);// 0 表示正常退出 1表示异常退出
}
Element rootElement = document.getDocumentElement();
System.out.println("根节点");
System.out.println(rootElement);
// 获取根节点下的 book 节点链表
System.out.println("获取根节点的 book 节点");
NodeList bookNodes = rootElement.getElementsByTagName("book");
NodeList bookNodes1 = rootElement.getElementsByTagName("Test");
System.out.println(bookNodes.item(0));
System.out.println(bookNodes.item(1));
System.out.println(bookNodes1.item(0));
System.out.println("DomUtils======================");
for (int i = 0; i < bookNodes.getLength(); i++) {// 遍历 book 节点链表
Book book = new Book();
Element bookElement = (Element) bookNodes.item(i);
String id = bookElement.getAttribute("id");
book.setId(id);
// 获取 book 节点下的子节点链表
NodeList childNodeList = bookElement.getChildNodes();
// 测试
System.out.println("获取 book 节点下的子节点");
System.out.println(childNodeList.item(0));
// System.out.println("childNodeList.item(0).getNodeType() is:"+childNodeList.item(0).getNodeType());
System.out.println(childNodeList.item(1));
System.out.println(childNodeList.item(2));
System.out.println(childNodeList.item(3));
System.out.println(childNodeList.item(4));
System.out.println(childNodeList.item(5));
System.out.println(childNodeList.item(6));
for (int j = 0; j < childNodeList.getLength(); j++) {
// 判断是否为节点类型,是正常节点类型才能获取节点信息
if (childNodeList.item(j).getNodeType() == Node.ELEMENT_NODE) {
if ("name".equals(childNodeList.item(j).getNodeName())) {
book.setBookName(childNodeList.item(j).getFirstChild()
.getNodeValue());
} else if ("price".equals(childNodeList.item(j)
.getNodeName())) {
book.setBookPrice(Float.parseFloat(childNodeList
.item(j).getFirstChild().getNodeValue()));
} else if ("test".equals(childNodeList.item(j)
.getNodeName())) {
book.setTest(childNodeList.item(j).getFirstChild()
.getNodeValue());
//测试
System.out.println("childNodeList.item(j) is:"
+ childNodeList.item(j));
System.out
.println("childNodeList.item(j).getFirstChild() is:"
+ childNodeList.item(j).getFirstChild());
System.out
.println("childNodeList.item(j).getFirstChild().getNodeValue() is:"
+ childNodeList.item(j).getFirstChild()
.getNodeValue());
//测试
System.out.println("childNodeList.item(j).getNodeType() is:"+childNodeList.item(j).getNodeType());
}
}
}
list.add(book);
}
return list;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3.Book.java
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class Book {
private String id;
private String bookName;
private float bookPrice;
private String test;
public String getId() {
return id;
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
public void setId(String id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public float getBookPrice() {
return bookPrice;
}
public void setBookPrice(float bookPrice) {
this.bookPrice = bookPrice;
}
public Book(String id, String bookName, float bookPrice) {
super();
this.id = id;
this.bookName = bookName;
this.bookPrice = bookPrice;
}
public Book() {
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4.book.xml
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
<?xml version="1.0" encoding="UTF-8"?>
<bookTest>
<book id = "1">
<name>thinking in java</name>
<price>85.5</price>
<test>Yellow Test</test>
</book>
<book id = "2">
<name>Spring in Action</name>
<price>39.0</price>
</book>
<Test>
</Test>
</bookTest>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
5.小结:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*
* Dom 解析过程
* 1.通过 Element bookElement = (Element) bookNodes.item(i); 获取根节点
* 2.通过 NodeList childNodeList = bookElement.getChildNodes(); 获取子节点
* 1)子节点包含"#text" 文本 和 节点元素
* 2)这里的节点元素不包含节点的关闭元素 比如 </name> 只包含开始标签元素 比如<name>
* 3.通过判断 if (childNodeList.item(j).getNodeType() == Node.ELEMENT_NODE) 是否为真来确定是不是节点元素
* 1)在 Node.class 中定义 public static final short ELEMENT_NODE = 1;
* 比如这里 <test> 元素返回的为 1 而 文本返回的为 3 可以通过下列语句测试
* System.out.println("childNodeList.item(0).getNodeType() is:"+childNodeList.item(0).getNodeType());
* 4.如果是结点元素,通过 if ("name".equals(childNodeList.item(j).getNodeName())) 判断他是否是 <name> 结点
* 5.如果是<name> 结点 通过 book.setBookName(childNodeList.item(j).getFirstChild().getNodeValue());获取节点文本,并设置
*
*
* 补充:
* 解析器物理查找:
* 1.查找 <bookTest> 根节点
* 2.查找根节点后的 子节点1 <book>
* 3.查找 子节点1 后的文本
* 4.查找 文本后的 <name>
* 5.查找<name> 后的文本
* 6.查找<price> 节点
* 7.查找<price> 节点后的文本
* 8.查找<test> 节点
* 9.查找<test> 后的文本
*
* 10.然后继续查找 子节点2
* 11.如此下去(可参考打印结果)
*
*
* 调用 Dom 解析
* 1.创建 DocumentBuilderFactory 对象
* DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
* 2.从 DoccumentBuilderFactory 对象中获取一个 DocumentBuilder 对象
* builder = factory.newDocumentBuilder();
* 3.使用 DocumentBulider 对象将 XML 文件输入流转化为一个 Document 对象
* document = builder.parse(inputStream);
*
* 读取 XML 的方式
* 1.通过 Java IO 流
* FileInputStream input = new FileInputStream("D:\\book.xml");
* Document doc = builder.parse(input);
*
* 2.用过文件方式读取
* File file = new File("D:\\book.xml");
* Document doc = builder.parse(file);
*
* 3.通过一个 URL 方式读取
* URL u = new UPL("http://java.sun.com/index.html");
* Document doc = builder.parse(u);
*
* 这里使用的是第一种
* */
3241

被折叠的 条评论
为什么被折叠?



