●簡介
dom4j和jdom都是用來解析xml的。
控制xml有四種api,sax,dom都比較底層,是java本身類庫中就包含的操作方式。
·dom方式
dom=Document Object Model方式是把整個xml文件作爲一個對象,放到內存中。
·sax方式 基於事件
5種事件
startDocument
endDocument
starElement
ednElement
character
simple API for XML 讀一點解析一點 不讀不解析不放入內存
在這基礎之上開發了dom4j和jdom.
dom4j的性能好,hibernate用的是dom4j.
●用Dom4j解析xml
·建立XML User.hbm.xml
<hibernate-mapping>
<class name="com.bjsxt.User" talbe="t_user">
<property name="username"></property>
<property name="password"></property>
</class>
</hibernate-mapping>
·建立類文件 在main方法中讀取xml。引入dom4j的包。
SAXReader reader = new SAXReader();
Document document = reader.read(new File("User.hbm.xml"));
//reader.read的參數還可以是一個文件流,這個文件可以通過當前類找到
//Class cls = 當前類.class;
//拿到當前類目錄下的文件流中的文件流
//InputStream in = cls.getResourceAsStream("User.hbm.xml");
//Document document = reader.read(in);
//拿到路徑cls.getResource("xxx.xml");返回一個bin目錄下的地址以URL格式。用url.getPath();得到路徑
Element rootElement = document.getRootElement();//拿到根元素 就是hibernate-mapping元素
rootElement.getName();拿到根元素的名字
//拿到第一個子節點 返回element
//rootElement.element("節點名");
//拿到第一個子節點的文本 返回string
//rootElement.elementText("節點名");
//遍歷根元素的子元素
for(Iterator i = rootElement.elementIterator();i.hasNext();){
Element element = (Element)i.next();
System.out.println(element.getName());
}
//枚舉名稱爲class的元素
for(Iterator i = root.elementiterator("class");i.hasNext();){
Element class = (Element)i.next();
System.out.println(class.getName());
//枚舉屬性
for(iterator i = class.attributeiterator(); i.hasNext();){
Attribute attribute = (Attribute)i.next();
System.out.println(attribute.getName());
}
}
//dom4j對XPath支持
//需要引入jar包,dom4j/lib/jaxen包
XPath就是在xml中找到特定節點的路徑的語法
//documents.selectNodes(此處參考XPath文檔 功能強大);
//Node n = documents.selectSingleNode("//user[@country='JP' and @pwd='123']");//詞句可以選擇名爲user 屬性conntry="JP" pwd='123'的所有的節點
List<Node> list = document.selectNodes("hibernate-mapping/class/property"); //把property節點全拿出來,作爲一個裝滿node對象的list返回
for(Node n : list){
System.out.println(n.getName()); //讀出節點
String name = n.valueOf(@name); //把n這個節點的名字叫name的屬性的值取出來
}
●用Dom4j爲xml添加內容並保存到xml
public static Document createDocument(){
Document document = DocumentHelper.createDocument(); //創建一個xml文件
Element root = document.addElement("hibernate-mapping");. //在文件中創建根節點名爲hibernate-mapping
Element classElement = root.addElement("class") //在根節點中添加節點class
.addAttribute("name","com.bjsxt.User") //爲class節點添加屬性 name=com.bjsxt.User 如果有名爲name的則修改此屬性
.addAttribute("table","t_user"); //爲class節點添加屬性 table="t_user"
//element.setText();可以添加文本
classElement.addElement("property").addAttribute("name","username");
//FileWriter out = new FileWriter("User1.hbm.xml");
//document.write(out);//將xml文件輸出到User1.hbm.xml
//out.flash();
//out.close();
//root.remove("classElement"); //刪除root的一個名爲classElement的子節點
OutputFormat format = OutputFormat.createPrettyPrint(); 創建格式
//document.setXMLEncoding("GB2312");//爲輸出的XML設置編碼
//format.setEncoding("GB2312");//爲格式化工具設置輸出編碼
//FileWriter總以本地字符(gbk)輸出所以會出現亂碼 建議用FileOutPutStream
XMLWriter writer = new XMLWriter(new FileWriter(User1.hbm.xml),format);創建格式輸出的XMLWriter
writer.write(document);輸出
writer.close();
return document;
}