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;
  }
 

 

 

 


 

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