dom4j及路徑筆記

 


●簡介
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;
  }
 

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章