Mao|天道酬勤|登高望远,精益求精

名佳丽!的java教程!

虽然名佳丽!我不是写java出生的,但是,咱也可以学嘛!现学现卖,java如何解析XML

上网随便搜索了一下现在流行的解析方法,发现有DOM、SAX、JDOM、DOM4J等等,而且,成都心情写了一篇《四种XML解析技术之不完全测试》的文章,对这四种方法进行了测试,发现使用Dom4J的效率是最高的,咱们是刚入门,什么负担都没有,完全可以自由选择,就像买DLSR一样,不是从胶片机过来的,没有C还是N的镜头存储,随便选嘛!Hoho,不好意思,最近看DLSR看多了,什么都忘那上面想的。^^

Dom4J现在的最新的版本是1.6.1怎么下Dom4J,怎么安装咱就不说了。把下下来的jar包加到classpath就可以使用了。

Dom4J还是比较博大精深的,但是我现在的要求没有这么高,我开始的目的只是想要XML文件来代替txt文件实现配置文件的功能就可以了,so,基本只需要从XMl文件中读取就可以了,实现最简单的功能,当然,只要仔细看下去,你会发现其实修改也很简单。

这个是我们学习所用的XML文件:




Java configuration with XML Schema

Marcello
Vitaletti




首先,读取整个XML文件:
需要org.dom4j.io.SAXReader包和org.dom4j.Document包,然后通过以下方式就可以了:
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(File inputXml);

然后是读取XML文件中各个值:
method1:读取article中level的值:
List list = document.selectNodes("//article/@level" );
 //将"//article/@level"(*1)读取到List(*2)中
 Iterator iter=list.iterator();//将List转换到Iterator中
 while(iter.hasNext()){
   Attribute attribute=(Attribute)iter.next();
   //读入Attribute中
   if(attribute.getValue().equals("Intermediate")){}
   //通过getValue()方法获得String类型的值
   attribute.setValue("Introductory");
   //通过setValue(String str)方法更新值
   System.out.println(attribute.getValue());
   }

method2:读取author节点下的节点的值得信息:
list = document.selectNodes("//article/author");
 iter=list.iterator();
 while(iter.hasNext()){
   Element element=(Element)iter.next();
  //转换为Element
   Iterator iterator=element.elementIterator("firstname");
   //通过Element.elementIterator(String node)方法或者某个节点
   while(iterator.hasNext()){
     Element firstNameElement=(Element)iterator.next();
     if(firstNameElement.getText().equals("Marcello"))
     //通过getText()方法获得String类型的值
     firstNameElement.setText("Ayesha");
     //通过setText(String str)方法更新值
     System.out.println(firstNameElement.getText());
   }
}

method3:通过直接指定某个节点的名字来获得值:
String nodes="//firstname";
   Node nodd = document.selectSingleNode(nodes);
   //通过selectSingleNode(String nodename)方法返回Node类型的值
   System.out.println(nodd.getText());
   //通过Node类中getText()即可获取String类型的值
   //Node也有setText(String value)方法来更新Node的值

哈哈,简单吧,当然我要实现的功能也很简单,至于怎么样把XML当数据用,咱还不会呢………
上面的代码中,只用method3就可以实现我所需要的功能了,而且,也是我自己原创的哦,虽然只有简单的三行,但是可以论家好不容易查了API才用出来的哦。

下面是一些有用的资料:
Dom4J的主页
Dom4J API
使用 dom4j 解析 XML

以及参考的一些文章:
成都心情:四种XML解析技术之不完全测试
Holen@Blog:用dom4j建立,修改XML文档,并解决格式化输出和中文问题
不迷不悟:用Dom4j解析XML及中文问题
注释:
(*1):如果想对"//article/@level"究竟代表什么有更深的了解,可以到Zvon tutorial.
(*2):java.util.List,非Dom4J类

最后是附带的源代码:

import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.Element;
import org.dom4j.Attribute;
import org.dom4j.io.XMLWriter;
import org.dom4j.io.SAXReader;
import org.dom4j.DocumentException;

import java.util.List;
import java.util.Iterator;
import java.io.*;


public class D4T {

public void modifyDocument(File inputXml){
  try{
  SAXReader saxReader = new SAXReader();
 Document document = saxReader.read(inputXml);

   List list = document.selectNodes("//article/@level" );
   Iterator iter=list.iterator();
   while(iter.hasNext()){
    Attribute attribute=(Attribute)iter.next();
    if(attribute.getValue().equals("Intermediate")){}
      //attribute.setValue("Introductory");
      System.out.println(attribute.getValue());
       }
       
       
       list = document.selectNodes("//article/author");
    iter=list.iterator();
     while(iter.hasNext()){
     Element element=(Element)iter.next();
     Iterator iterator=element.elementIterator("firstname");
    while(iterator.hasNext()){
      Element firstNameElement=(Element)iterator.next();
      if(firstNameElement.getText().equals("Marcello"))
      //firstNameElement.setText("Ayesha");
      System.out.println(firstNameElement.getText());
        }
}

String nodes="//firstname";
Node nodd = document.selectSingleNode("//lastname");
System.out.println(nodd.getText());
}
catch(DocumentException e){
       System.out.println(e.getMessage());
     }
     catch(Exception e){
      System.out.println(e.getMessage());
     }

}
public static void main(String[] argv){
  D4T dom4jParser=new D4T();
  dom4jParser.modifyDocument(new File("d:/code/mytest/catalog.xml"));
}

}

2 条评论

  1. 怪怪 @ 2005-07-01 09:16

    小样,挺强嘛,虽然我还没空查阅――

  2. 猫鱼馒头猪 @ 2005-07-01 09:35

    看俺是看不懂。。。
    但是这篇字里行间洋溢的感觉,咋就觉得不像是毛毛同学写的捏?
    有点瞄苗和那女人的风格。。。

« [Z] Windows XP 安装SP2以后系统服务的变化毕业周年 »