xml查询入门笔记

来源:互联网 发布:手机淘宝联盟怎么注册 编辑:程序博客网 时间:2024/06/14 01:50
 

刚学xml,买了本《java与xml》第二版,浏览以后,决定动手试验一下。



看书的时候接触到了许多概念,比如:dom,sax,jdom,jaxp,xquery,xpath等等,有点,都是大概浏览了一下。

在最基础的一些试验过后,我想到了一个很重要的应用,就是xml查询。google里忙了一阵,在ibm的网站上找到一个xquery教程,上面说xquery是建立在xpath基础上的,而且功能还挺强。我大意的认为xpath不用看了(后悔啊)。我照着教程里说的下了个XQEngine ,是0.66版的,我虽然学了点XQuery语法但不会用这个引擎,文档也不是很清楚,于是上网找了一个例子(也只能找到一个关于XQEngine的例子)便照着做了起来,可是总报错,最后才知道是那个例子用的引擎版本是老的,新版本的API已经改了很多,用法大不一样。没办法,只能自己想了,费了不少功夫才入了门。




xml文件:
books.xml

<?xml version="1.0" encoding="gb2312"?>
<books>
    <book id="1">
        <name>goodbook</name>
        <price>200.20</price>
    </book>
    <book id="2">
        <name>badbook</name>
        <price>100.10</price>
    </book>
</books>

另有查询文件query.txt

let $book:=//book
where
$book/@id<=1
return
 <books>
 {
  $book
 }
 </books>

java文件testxqengine.java

import com.fatdog.xmlEngine.XQEngine;
import com.fatdog.xmlEngine.ResultList;
import org.xml.sax.helpers.XMLReaderFactory;

import java.io.PrintWriter;

public class testxqengine {
    public static void main(String[] args)
    {
        XQEngine myengine= new XQEngine();
        try
        {
            myengine.setXMLReader(XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"));  //用的xerces解析器
            myengine.setDocument("d:/java-procs/xmltest/data/books.xml");
            ResultList rl=myengine.setQueryFromFile("d:/java-procs/xmltest/data/query.txt");  //这里暂用绝对路径做试验
            System.out.println(rl.emitXml(true)); //这个true是让输出的xml符合一般格式的
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

程序输出结果:

<books><book id="1">
        <name>goodbook</name>
        <price>200.20</price>
    </book>
<book id="2">
        <name>badbook</name>
        <price>100.10</price>
    </book>
</books>



看到结果出来,当时那个激动啊,因为在论坛里问了半天没人理我啊。

但又一个问题来了,如果我只要其中的一个节点的值怎么办,难道还要先输出文件再用dom解析?!(当然不可能),和往常一样,在论坛里没有找到满意的答复。看遍了XQEngine的API文档也找不到解析ResultList的方法。忽然觉得不对劲,很可能是用其它的办法获得特定节点的值。于是回过去看《java与xml》第二版,终于在jdom那章(当时没怎么在意这张,因为书上说1.0版本还没出来)找到了XPath,顺带把jdom详细的看了一遍,发现这个冬冬还真的很方便,上机试了一下,果然很爽


TestJdom.java:

import org.jdom.input.SAXBuilder;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.Element;
import org.jdom.Text;
import org.jdom.xpath.XPath;

import java.io.IOException;

public class TestJdom {
    public static void main(String[] args) {
        SAXBuilder mybuilder = new SAXBuilder();
        try {
            Document doc = mybuilder.build("data/books.xml");
            Element root=doc.getRootElement();
            String name=((Element)XPath.selectSingleNode(root,"book[@id='1']/name")).getText();
            System.out.println(name);
        } catch (JDOMException e) {
            e.printStackTrace();} 
          catch (IOException e) {
            e.printStackTrace(); 
        }
    }
}

到这里,xml查询终于入了门,总结如下:xpath用于选择特定的节点并直接处理很方便,xquery对于查询xml文件中部分内容并输出为xml文件非常方便。

再接再厉吧!

原创粉丝点击