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("安托萬·德·圣·??颂K佩里");
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();
}
}
2016-07-22
問題已解決呢就沒什么看的了