用Dom4j解析XML文档
用java从XML文档中读取数据的例子网上已经很多了,大概有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根结点,下有两个子结点(即2个module)每个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这层时,它还是把所有的10个SQL都读取了一遍,而我想要的时,提拱module 1的 id “oo”后,只遍历其中的7个而不是把module2的”qq”中的3个sql也遍历了。
请各位高个帮忙看看有什么好的办法。能解决这个问题。