《Java高级-Xml:利用JDOM解析XML》

利用JDOM解析XML

        JDOM是一个开源项目,它基于树形结构,利用纯Java的技术对XML文档实现解析、生成、序列化及多种操作。JDOM与DOM非常类似,它是处理XML的纯JAVA API,API大量使用了Collections类,且JDOM仅使用具体类而不使用接口。JDOM 它自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 DOM 表示作为输入)。

(一)JDOM定义

JDOM中JAXP是用于XML语法分析的Java API,包含了下面三个包:

1. org.w3c.dom W3C推荐的用于XML标准文档对象模型的Java工具。
2. org.xml.sax 用于对XML进行语法分析的事件驱动的简单API。
3. javax.xml.parsers 工厂化工具,允许应用程序开发人员获得并配置特殊的语法分析器工具,JDOM能够替换org.w3c.dom软件包来有计划地操作XML文档。
JDOM主要用来弥补DOM和SAX在实际应用当中的不足。主要是SAX没有文档修改、随机访问及输出的功能,而DOM,Java程序员在使用时总觉得不太方便(比如DOM定义了自己的Text类而不是使用Java的String)。

(二)JDOM解析xml步骤

2.1:建立解析器

SAXBuilder sb=new SAXBuilder();
//返回Document文档
Document doc=sb.build(new FileInputStream(XmlFname));

2.2:DOM处理

元素基于Content类.Element类操作同Dom.详见Java XML解析 - 利用dom(org.w3c.dom)解析XML

2.3:DOM结果处理(输出/保存)

Format fo=Format.getCompactFormat();//取得输出格式Format
//fo.setEncoding("GB2312");
XMLOutputter outputter=new XMLOutputter(fo);
FileWriter write=new FileWriter(XmlFname);//这里可以是PrintWriter形式的(任何Writer流).
outputter.output(doc,write/*Writer流,见构造函数*/);
write.close();

(三)JDOM解析xml例子

3.1:xml文件

//xml文件
<?xml version="1.0" encoding="UTF-8"?>        
<AirPortLine>        
  <line lid="MU2480" num="3">        
    <id>1</id>        
    <station>        
      <sid>1</sid>        
      <sname>武汉</sname>        
    </station>        
    <station>        
      <sid>2</sid>        
      <sname>石家庄</sname>        
    </station>        
    <station>        
      <sid>3</sid>        
      <sname>北京</sname>        
    </station>        
  </line>        
  <line lid="MU2483" num="4">        
    <id>2</id>        
    <station>        
      <sid>1</sid>        
      <sname>重庆</sname>        
    </station>        
    <station>        
      <sid>2</sid>        
      <sname>武汉</sname>        
    </station>        
    <station>        
      <sid>3</sid>        
      <sname>上海</sname>        
    </station>        
    <station>        
      <sid>4</sid>        
      <sname>东京</sname>        
    </station>        
  </line>        
  <line lid="MU2485" num="2">        
    <id>3</id>        
    <station>        
      <sid>1</sid>        
      <sname>上海</sname>        
    </station>        
    <station>        
      <sid>2</sid>        
      <sname>纽约</sname>        
    </station>        
  </line>        
</AirPortLine>

3.2:解析XML

解析XML testJDOM.java


//解析XML testJDOM.java
public class testJDOM {  
    public static void main(String[] args) {  
        try {  
            File file = new File("AirPortLine.xml");  
            SAXBuilder builder = new SAXBuilder();  
            Document doc = builder.build(file);  

            parseJDOM(doc);// 解析XML文档  

        } catch (Exception e) {  
            System.out.println("Can't read the file");  
        }  
    }  

    // 解析XML文档  
    private static void parseJDOM(Document doc) {  
        Element root = doc.getRootElement();  
        List lineList = root.getChildren("line");// 也可使用root.getChildren()  
        for (Iterator iter = lineList.iterator(); iter.hasNext();) {  
            Element lineElement = (Element) iter.next();// 获取<line>元素  

            String lid = lineElement.getAttributeValue("lid");// 获取<line>元素的lid属性值  
            String num = lineElement.getAttributeValue("num");// 获取<line>元素的num属性值  

            System.out.println("==lid:" + lid);  
            System.out.println("==num:" + num);  

            Element idElement = lineElement.getChild("id");// 获得<line>下<id>标签下的子元素  
            String id = idElement.getText();// // 获得<line>下<id>标签下的子元素值  
            System.out.println("==路线id:" + id);  

            List stationList = lineElement.getChildren("station");// 获得<line>下<station>列表  
            for (Iterator subIter = stationList.iterator(); subIter.hasNext();) {  
                Element stationElement = (Element) subIter.next();// 获取<station>元素  

                Element sidElement = stationElement.getChild("sid");// 获得<station>下<sid>标签下的子元素  
                Element snameElement = stationElement.getChild("sname");// 获得<station>下<sname>标签下的子元素  
                String sid = sidElement.getText();// 获得<station>下<sid>标签下的子元素值  
                String sname = snameElement.getText();// 获得<station>下<sname>标签下的子元素值  

                System.out.println("==路线sid:" + sid);  
                System.out.println("==路线sname:" + sname);  
            }  
        }  
    }  
}

(四)总结

1. JDOM是作为一种轻量级的API被制定的,最主要的是它是以Java为中心的。它在遵循DOM主要规则的基础上除去了上述缺点。

2. JDOM是Java平台专用的,只要有可能,API都使用Java语言的内建String支持。

3. 在JDOM中,XML元素就是Element的实例,XML属性就是Attribute的实例,XML文档本身就是Document的实例。

4. 因为JDOM对象就是像Document、Element和Attribute这些类的直接实例,因此创建一个新的JDOM对象就如在Java语言中使用new操作符一样容易。它还意味着不需要进行工厂化接口配置——JDOM的使用是直截了当的。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大大钢琴

喜欢!就请他吃3块钱好吃的吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值