package imooc.dmtest;
import java.io.File;
import java.io.IOException;
import javax.lang.model.element.Element;
import javax.swing.text.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMTest {
/**
* 创建一个DocumentBuilder
* @return
*/
public DocumentBuilder getDocumentBuilder() {
// 创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder对象
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
return db;
}
/**
* 解析XMl文件
*/
public void xmlParser() {
try {
// 通过DocumentBuilder对象的parser方法加载book.xml文件到当前项目下
org.w3c.dom.Document document = getDocumentBuilder().parse("book.xml");
// 获取所有book节点的集合
NodeList booklist = document.getElementsByTagName("book");
// 通过nodelist的getlength()方法可以获取booklist的长度
System.out.println("一共有" + booklist.getLength() + "本书");
// 遍历每一个book节点
for (int i = 0; i < booklist.getLength(); i++) {
System.out.println("==========================下面开始遍历第" + (i + 1) + "这本书的内容==========");
// 通过item(i)获取一个book节点,Nodelist的索引值从0开始
Node book = booklist.item(i);
// 获取book节点的所有属性集合
NamedNodeMap attrs = book.getAttributes();
System.out.println("第" + (i + 1) + "本书共有" + attrs.getLength() + "个属性");
for (int j = 0; j < attrs.getLength(); j++) {
// 通过item(intex)方法获取book节点的某一个属性
Node attr = attrs.item(j);
// 获取属性名
System.out.print("属性名:" + attr.getNodeName());
// 获取属性值
System.out.println("--属性值" + attr.getNodeValue());
}
// 前提:已经知道book节点有些只有一个id属性
// 讲book节点强制进行类型转换,转换成Element类型
// org.w3c.dom.Element book = (org.w3c.dom.Element)
// booklist.item(i);
// //获取属性值
// String attrValue = book.getAttribute("id");
// System.out.println("id属性的属性值为"+ attrValue);
// 解析book节点的子节点
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(childNodes.item(k).getNodeName() + ":");
// 获取了element类型节点的节点值
// System.out.println(childNodes.item(k).getFirstChild().getNodeValue());
System.out.println(childNodes.item(k).getTextContent());
}
}
System.out.println("=========================结束遍历第" + (i + 1) + "这本书的内容==========");
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 生成xml的方法
*/
public void createXML() {
// 创建DOMTest对象
DocumentBuilder db = getDocumentBuilder();
org.w3c.dom.Document document = db.newDocument();
document.setXmlStandalone(true);
org.w3c.dom.Element bookstore = document.createElement("bookStore");
// 向bookstore根节点中添加子节点book
org.w3c.dom.Element book = document.createElement("book");
org.w3c.dom.Element name = document.createElement("name");
org.w3c.dom.Element author = document.createElement("author");
org.w3c.dom.Element year = document.createElement("year");
org.w3c.dom.Element price = document.createElement("price");
org.w3c.dom.Element language = document.createElement("language");
// name.setNodeValue("xiaomingzi");行不通
name.setTextContent("小王子");
author.setTextContent("安托万·德·圣·埃克苏佩里");
year.setTextContent("1942");
price.setTextContent("22");
book.appendChild(name);
book.appendChild(author);
book.appendChild(year);
book.appendChild(price);
//设置book的属性
book.setAttribute("id", "1");
// 将book节点添加到bookstore根节点中
bookstore.appendChild(book);
//此处尝试添加第二本书,之前由于变量名重复造成失败,现在改变量名之后成功添加第二本书
org.w3c.dom.Element book1 = document.createElement("book");
org.w3c.dom.Element name1 = document.createElement("name");
org.w3c.dom.Element author1 = document.createElement("author");
org.w3c.dom.Element year1 = document.createElement("year");
org.w3c.dom.Element price1 = document.createElement("price");
name1.setTextContent("冰与火之歌");
author1.setTextContent("乔治马丁");
year1.setTextContent("2014");
price1.setTextContent("89");
book1.appendChild(name1);
book1.appendChild(author1);
book1.appendChild(year1);
book1.appendChild(price1);
book1.setAttribute("id", "2");
bookstore.appendChild(book1);
// 将bookstores节点(已经包含了book)添加到dom树中
document.appendChild(bookstore);
// 创建TransformFactory对象
TransformerFactory tff = TransformerFactory.newInstance();
try {
Transformer tf = tff.newTransformer();
// 设置换行
tf.setOutputProperty(OutputKeys.INDENT, "yes");
//设置缩进量
tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
tf.transform(new DOMSource(document), new StreamResult(new File("books1.xml")));
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
/**
* 主方法,程序的入口
*
* @param args
*/
public static void main(String[] args) {
// 创建DOMTest对象
DOMTest test = new DOMTest();
// 调用解析方法,解析XMl文件
test.createXML();
}
}