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代码
- /**
- * 解 析XML文件,这里有多重读取方式,这里是URL
- * @param url
- * @return
- * @throws DocumentException
- */
- public Document parse(URL url) throws DocumentException{
- SAXReader reader = new SAXReader();
- return reader.read(url);
- 10. }
- 11. /**
- 12. * 采 用用路径构造文件的方法
- 13. * @param path
- 14. * @return
- 15. * @throws DocumentException
- 16. */
- 17. public Document parse(String path) throws DocumentException{
- 18. SAXReader reader = new SAXReader();
- 19. return reader.read(new File(path));
- 20. }
- 21. /**
- 22. * 用 文件流对象构造xml文档
- 23. * @param in
- 24. * @return
- 25. * @throws DocumentException
- 26. */
- 27. public Document parse(InputStream in) throws DocumentException{
- 28. SAXReader reader = new SAXReader();
- 29. return reader.read(in);
- 30. }
Using Iterators用迭代打方式解析xml文件的内容
Java代码
- /**
- * 遍 历xml文件
- * @param document
- */
- public void iteratorFind(Document document){
- Element root = document.getRootElement();
- //从根节点遍历
- for(Iterator i = root.elementIterator();i.hasNext();){
- Element element = (Element) i.next();
- 10. System.out.println(element.attributeValue("name"));
- 11. System.out.println(element.getText());
- 12. }
- 13.
- 14. //从某一节点开始遍历
- 15. for(Iterator i = root.elementIterator("foo");i.hasNext();){
- 16. Element element = (Element) i.next();
- 17. //做一些事情
- 18. }
- 19. //遍历属性
- 20. for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
- 21. Attribute attribute = (Attribute) i.next();
- 22. // do something
- 23. }
- 24.
- 25. }
Powerful Navigation with XPath强大的xpath导航
Java代码
- /**
- * X- path的查找方式
- * @param document
- */
- public void xpathFind(Document document){
- List<Element> list = document.selectNodes("/root/author");
- for(int i=0;i<list.size();i++){
- Element element = list.get(i);
- String name = element.attributeValue("name");
- 10. System.out.println(name);
- 11. }
- 12. System.out.println(list.size());
- 13. Node node = document.selectSingleNode("/root/author");
- 14. //采用@+属性名的方式获得属内容
- 15. String name = node.valueOf("@name");
- 16. String text = node.getText();
- 17. System.out.println(name + text);
- 18. }
Fast Looping 快速循环,实际上和iterator差不多
Java代码
- public void treeWalk(Document document) {
- treeWalk( document.getRootElement() );
- }
- public void treeWalk(Element element) {
- for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
- Node node = element.node(i);
- if ( node instanceof Element ) {
- treeWalk( (Element) node );
- 10. }
- 11. else {
- 12. // do something....
- 13. }
- 14. }
- 15. }
Creating a new XML document 创建一个新的xml文档,建议按我的教程先执行这步操作,后面的解析内容都是应用这部分demo产生的xml文件进行的。
Java代码
- /**
- * 创 建一个XML文件
- * @return
- */
- public Document createDocument(){
- Document document = DocumentHelper.createDocument();
- Element root = document.addElement("root");
- Element author1 = root.addElement("author")
- .addAttribute("name", "James")
- 10. .addAttribute("location", "UK")
- 11. .addText( "James Strachan" );
- 12.
- 13. Element author2 = root.addElement( "author" )
- 14. .addAttribute( "name", "Bob" )
- 15. .addAttribute( "location", "US" )
- 16. .addText( "Bob McWhirter" );
- 17.
- 18. return document;
- 19.
- 20. }
Write xml document to file 将xml文件写入到文件系统,即存储到磁盘,但是这个写的文件格式不是很好看
Java代码
- /**
- * 写 xml文档到磁盘文件
- * @param document
- * @throws IOException
- */
- public void writeFile(Document document) throws IOException{
- XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
- writer.write(document);
- writer.close();
- 10. }
这里提供一种比较好看的输出方式
Java代码
- /**
- * 格 式话写xml文件
- * @param document
- * @throws IOException
- */
- public void prettyWrite(Document document) throws IOException{
- OutputFormat format = OutputFormat.createPrettyPrint();
- XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
- writer.write(document);
- 10. writer.close();
- 11. }
Converting to and from Strings 将字符串转换成xml文件
Java代码
- /**
- * 将 文本的xml文件转换成xml文档
- * @return
- * @throws DocumentException
- */
- public Document convertFromStr() throws DocumentException{
- String xmlStr = "<books><book author='李连杰'>1基金</book>& lt;book author='周星驰'>演员的自我修养</book></books>";
- Document document = DocumentHelper.parseText(xmlStr);
- return document;
- 10. }
也可以将xml文档转换成string
Java代码
- /**
- * 将 xml文档转换成String
- * @return
- * @throws DocumentException
- */
- public String covertFromXML() throws DocumentException{
- Document document = convertFromStr();
- return document.asXML();
最后写下dom4j对visitor的支持,先写一visitor类,继承自VisitorSupport
Java代码
- public class MyVisitor extends VisitorSupport {
- @Override
- public void visit(Attribute attribute) {
- System.out.println("-----"+attribute.getValue());
- }
- @Override
- public void visit(Element element) {
- 10. System.out.println("------"+element.getText());
- 11. }
- 12.
13. }
调用的时的方法,直接使用文档或者节点.appept(new 自己写的visitor类);
Java代码
- public void testVisitor() throws DocumentException{
- Document document = xml.convertFromStr();
- //document.accept(new MyVisitor());
- document.selectSingleNode("/books/book").accept(new MyVisitor());
- }
浙公网安备 33010602011771号