用Dom4j解析xml文档中遇到的问题

本文档介绍如何使用Dom4j解析XML文档,特别是针对含有多个module和sql的结构。目标是通过模块ID获取对应的SQL语句,目前实现可以获取所有SQL,但存在优化问题:提供module ID后,仍会遍历所有模块的SQL。寻求解决方案以避免不必要的遍历。

Dom4j解析XML文档

 

javaXML文档中读取数据的例子网上已经很多了,大概有4种,dom,sax,jdom,dom4j

我选择了dom4j,下面是我的例子,及一些看法和问题。

首先是要读取的xml文件,名子为:sql.xml。内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<pp>

       <module id="oo">

              <sql id="id1">

              select * from aa $:aa where aa=:aa}

           </sql>

              <sql id="id2">

              select aa from aa where aa is not null and (aa=1 or bb=2) and substr(aaed,0,3) = :dd

           </sql>

              <sql id="id3">

             SQL3

         </sql>

             

              <sql id="id4"><![CDATA[               

                  SQL4

                  ]]></sql>

             

              <sql id="id5"><![CDATA[

                            select t.aa,t.bb,t.cc,t.dd,t.ee,t.ff

                            from AA t

                            where t.aa =:dd

                            order by t.aa,t.bb

        ]]></sql>

              <sql id="id6"><![CDATA[

                            select dd from ff where ss='ff' and ff='ff' and  ee=:gg

        ]]></sql>

       

    <sql id="id7"><![CDATA[

                            SELECT usename FROM Login WHERE useid= ? and password= ?

        ]]></sql>

       </module>

      

       <module id="qq">

              <sql id="id8"><![CDATA[

                  DELETE  FROM dd WHERE ff in(:dd[split as array])

                  ]]></sql>

              <sql id="id9"><![CDATA[

        Select code, decode(code,'qqqqqq','成功','不成功') name from aa where dd = '3333'                

        ]]></sql>

              <sql id="id10"><![CDATA[

                            SQL10

        ]]></sql>

       </module>

</pp>

文档结构为,一个PP根结点,下有两个子结点(即2module)每个module下有若干个sql(由于是例子,所以隐去表名及字段)

 

想实现的功能:只要提供一个sqlid 就能得到对应的sql语句。

import java.io.File;

import java.util.Iterator;

import java.util.LinkedHashMap;

import java.util.List;

//import java.util.Map;

 

import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

 

public class Dom4jPaserTest

{

    String uri = "//pp/module/@id";

   

    static boolean a;

    static SAXReader saxReader = new SAXReader();

    static Document document;

    public static void main(String[] args)

    {

       try

       {

           document = saxReader.read(new File("sql.xml"));

       } catch (DocumentException e)

       {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

      

       //String url1 = "//pp/module/sqi/@id";

       String url2 = "//pp/module/sql";

      

       LinkedHashMap l = new LinkedHashMap();

       Dom4jPaserTest dom4jParser=new Dom4jPaserTest();

      

      

       //System.out.println(str);

        a = new Dom4jPaserTest().isOK("qq");

       

        l = dom4jParser.paserDoc(a,url2);

       

        String sql = (String)l.get("id9");

       

        System.out.println(sql);

 

    }

   

    public LinkedHashMap paserDoc(boolean a,String url2)

    {

       int i = 0;

       LinkedHashMap lhm = new LinkedHashMap();

       //Attribute attr = null;

       Element e = null;

       Object key = null;

       Object value = null;

       if(a)

       {

           try

           {

              List list = document.selectNodes(url2);

               Iterator iter=list.iterator();

             

              while(iter.hasNext())

               {

                 //attr=(Attribute)iter.next();

                 e=(Element)iter.next();

                

                 key = e.attributeValue("id");

                 value = e.getText().trim();

                 //key = attr.get

                 //System.out.println(++i);

                 lhm.put(key, value);

                

                 key = null;

                 value = null;

               }

           }

           catch (Exception ee)

           {

              // TODO Auto-generated catch block

              ee.printStackTrace();

           }

       }

      

       return lhm;

    }

   

   

    public boolean isOK(String moduleID)

    {

      

       boolean b = true;

       try

       {

           List list1 = document.selectNodes(uri);

           Iterator iter=list1.iterator();

          

           while(iter.hasNext())

           {

              b = true;

              Attribute attribute=(Attribute)iter.next();

              if(attribute.getValue().equals(moduleID))

                 return b;

              else

                 b = false;

             

           }

       }

       catch (Exception e)

       {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

      

           return b;

 

    }

 

}

功能是可以实现了,但存在一个问题,当访问到//pp/module/sql这层时,它还是把所有的10SQL都读取了一遍,而我想要的时,提拱module 1 id “oo”后,只遍历其中的7个而不是把module2”qq”中的3sql也遍历了。

请各位高个帮忙看看有什么好的办法。能解决这个问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值