dom4j(二)

有时用来生成一个xml格式的文件,或者把一个字符串转成xml格式的,或者便利一个节点下的对象,记住,便利一个节点下的对象,仅是这个节点下的对象,而没有孙节点,下面是从网找的一些基本操作;

  

XML(Extensible Markup Language)即可扩展标记语言,这个东东的详细情况可以参见百度百科,我主要说下它的两大作用1.存储数据;2.跨平台的数据传输(也就是应用于不 同的平台之上,有桥梁的作用,我是这么理解的,呵呵)。ok,现在说说对xml文件的解析,java本事对xml有一套规范和解析方式,但是不是很好用, 目前比较常用的其他解析类库有jdom和dom4j,相比之下据说dom4j相对强大一点,那我们就用dom4j吧。

首先需要说明的是这个技术的学习方略是按照官方的文档进行。并没有参见其他的文章,虽然文档时英文的,虽然我的英语很菜,但还是能看懂的。相当于官 方说明的翻译工作吧。

1.下载dom4j的压缩包,个人比较喜欢去官方找。英文的网站找google大神就搞定了。

2.在eclipse下新建java工程,放入dom4j要用到的jar包,这里要用到两个dom4j-1.6.1.jar和jaxen-1.1- beta-6.jar个,后者是在用到xpath的时候用,负责会报错!

3.打开下载的安装包下的docs目录下index.html文件,一大堆英文出来了,点左侧的那个quick start快速开始,翻译工作开始:

Parsing XML解析xml文件,第一种是官方文档上的,二三是我自己加的:

Java代码

  1. /**
  2.      * 解 析XML文件,这里有多重读取方式,这里是URL
  3.      * @param url
  4.      * @return
  5.      * @throws DocumentException
  6.      */ 
  7.     public Document parse(URL url) throws DocumentException{ 
  8.         SAXReader reader = new SAXReader(); 
  9.         return reader.read(url); 
  10. 10.     } 
  11. 11.     /**
  12. 12.      * 采 用用路径构造文件的方法
  13. 13.      * @param path
  14. 14.      * @return
  15. 15.      * @throws DocumentException
  16. 16.      */ 
  17. 17.     public Document parse(String path) throws DocumentException{ 
  18. 18.         SAXReader reader = new SAXReader(); 
  19. 19.         return reader.read(new File(path)); 
  20. 20.     } 
  21. 21.     /**
  22. 22.      * 用 文件流对象构造xml文档
  23. 23.      * @param in
  24. 24.      * @return
  25. 25.      * @throws DocumentException
  26. 26.      */ 
  27. 27.     public Document parse(InputStream in) throws DocumentException{ 
  28. 28.         SAXReader reader = new SAXReader(); 
  29. 29.         return reader.read(in); 
  30. 30.     } 

 

  Using Iterators用迭代打方式解析xml文件的内容

Java代码

  1. /**
  2.      * 遍 历xml文件
  3.      * @param document
  4.      */ 
  5.     public void iteratorFind(Document document){ 
  6.         Element root = document.getRootElement(); 
  7.         //从根节点遍历 
  8.         for(Iterator i = root.elementIterator();i.hasNext();){ 
  9.             Element element = (Element) i.next(); 
  10. 10.             System.out.println(element.attributeValue("name")); 
  11. 11.             System.out.println(element.getText()); 
  12. 12.         } 
  13. 13.          
  14. 14.         //从某一节点开始遍历 
  15. 15.         for(Iterator i = root.elementIterator("foo");i.hasNext();){ 
  16. 16.             Element element = (Element) i.next(); 
  17. 17.             //做一些事情 
  18. 18.         } 
  19. 19.         //遍历属性 
  20. 20.         for ( Iterator i = root.attributeIterator(); i.hasNext(); ) { 
  21. 21.             Attribute attribute = (Attribute) i.next(); 
  22. 22.             // do something 
  23. 23.         } 
  24. 24.  
  25. 25.     } 

  Powerful Navigation with XPath强大的xpath导航

Java代码

  1. /**
  2.      * X- path的查找方式
  3.      * @param document
  4.      */ 
  5.     public void xpathFind(Document document){ 
  6.         List<Element> list = document.selectNodes("/root/author"); 
  7.         for(int i=0;i<list.size();i++){ 
  8.             Element element = list.get(i); 
  9.             String name = element.attributeValue("name"); 
  10. 10.             System.out.println(name); 
  11. 11.         } 
  12. 12.         System.out.println(list.size()); 
  13. 13.         Node node = document.selectSingleNode("/root/author"); 
  14. 14.         //采用@+属性名的方式获得属内容 
  15. 15.         String name = node.valueOf("@name"); 
  16. 16.         String text = node.getText(); 
  17. 17.         System.out.println(name + text); 
  18. 18.     } 

  Fast Looping 快速循环,实际上和iterator差不多

Java代码

  1. public void treeWalk(Document document) { 
  2.        treeWalk( document.getRootElement() ); 
  3.    } 
  4.  
  5.    public void treeWalk(Element element) { 
  6.        for ( int i = 0, size = element.nodeCount(); i < size; i++ ) { 
  7.            Node node = element.node(i); 
  8.            if ( node instanceof Element ) { 
  9.                treeWalk( (Element) node ); 
  10. 10.            } 
  11. 11.            else { 
  12. 12.                // do something.... 
  13. 13.            } 
  14. 14.        } 
  15. 15.    } 

 

Creating a new XML document 创建一个新的xml文档,建议按我的教程先执行这步操作,后面的解析内容都是应用这部分demo产生的xml文件进行的。

Java代码

  1. /**
  2.      *  创 建一个XML文件
  3.      * @return
  4.      */ 
  5.     public Document createDocument(){ 
  6.         Document document = DocumentHelper.createDocument(); 
  7.         Element root = document.addElement("root"); 
  8.         Element author1 = root.addElement("author") 
  9.         .addAttribute("name", "James") 
  10. 10.         .addAttribute("location", "UK") 
  11. 11.         .addText( "James Strachan" ); 
  12. 12.           
  13. 13.         Element author2 = root.addElement( "author" ) 
  14. 14.          .addAttribute( "name", "Bob" ) 
  15. 15.          .addAttribute( "location", "US" ) 
  16. 16.          .addText( "Bob McWhirter" ); 
  17. 17.  
  18. 18.      return document; 
  19. 19.  
  20. 20.     } 

Write xml document to file 将xml文件写入到文件系统,即存储到磁盘,但是这个写的文件格式不是很好看

 

Java代码

  1. /**
  2.      * 写 xml文档到磁盘文件
  3.      * @param document
  4.      * @throws IOException
  5.      */ 
  6.     public void writeFile(Document document) throws IOException{ 
  7.         XMLWriter writer = new XMLWriter(new FileWriter("output.xml")); 
  8.         writer.write(document); 
  9.         writer.close(); 
  10. 10.     } 

 

  这里提供一种比较好看的输出方式

 

Java代码

  1. /**
  2.      * 格 式话写xml文件
  3.      * @param document
  4.      * @throws IOException
  5.      */ 
  6.     public void prettyWrite(Document document) throws IOException{ 
  7.         OutputFormat format = OutputFormat.createPrettyPrint(); 
  8.         XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format); 
  9.         writer.write(document); 
  10. 10.         writer.close(); 
  11. 11.     } 

Converting to and from Strings 将字符串转换成xml文件

 

Java代码

  1. /**
  2.      * 将 文本的xml文件转换成xml文档
  3.      * @return
  4.      * @throws DocumentException
  5.      */ 
  6.     public Document convertFromStr() throws DocumentException{ 
  7.         String xmlStr = "<books><book author='李连杰'>1基金</book>& lt;book author='周星驰'>演员的自我修养</book></books>"; 
  8.         Document document = DocumentHelper.parseText(xmlStr); 
  9.         return document; 
  10. 10.     } 

 

  也可以将xml文档转换成string

 

Java代码

  1. /**
  2.      * 将 xml文档转换成String
  3.      * @return
  4.      * @throws DocumentException
  5.      */ 
  6.     public String covertFromXML() throws DocumentException{ 
  7.         Document document = convertFromStr(); 
  8.         return document.asXML(); 

  最后写下dom4j对visitor的支持,先写一visitor类,继承自VisitorSupport

 

Java代码

  1. public class MyVisitor extends VisitorSupport { 
  2.  
  3.     @Override 
  4.     public void visit(Attribute attribute) { 
  5.         System.out.println("-----"+attribute.getValue()); 
  6.     } 
  7.  
  8.     @Override 
  9.     public void visit(Element element) { 
  10. 10.         System.out.println("------"+element.getText()); 
  11. 11.     } 
  12. 12.      

13. } 

 

调用的时的方法,直接使用文档或者节点.appept(new 自己写的visitor类);

 

Java代码

  1. public void testVisitor() throws DocumentException{ 
  2.         Document document = xml.convertFromStr(); 
  3.         //document.accept(new MyVisitor()); 
  4.         document.selectSingleNode("/books/book").accept(new MyVisitor()); 
  5.     } 
posted @ 2012-01-11 12:04  淡泊名利  阅读(1116)  评论(0)    收藏  举报