Jakarta-Common-JXPath使用笔记

来源:互联网 发布:金山毒霸网络企业版 编辑:程序博客网 时间:2024/05/29 08:36

JXPath是apache公司提供的XPath的java实现,属于jakarta的一部分,最新的版本是1.1,JXPath的主要功能在于一组java类库来使用XPath的方式访问符合JavaBeans规范的java类、java集合(Collections)、其他具有动态属性的对象(如Map、ServletContext等),同时提供了一套扩展机制使我们可以增加对这些对象之外的其他对象模型的支持。 

下载地址:http://commons.apache.org/jxpath/

A.访问JavaBean的属性

package demo.bean;

import java.util.Comparator;

public class Company implements Comparator<Object>{

    
private String name = "";
    
private int id = 0;
    
private String address = "";
    
public  void setName(String p_name){
        
this.name = p_name;
    }

    
public void setId(int p_id){
        
this.id = p_id;
    }

    
public void setAddress(String p_address){
        
this.address = p_address;
    }

    
public String getName(){
        
return this.name;
    }

    
public int getId(){
        
return this.id;
    }

    
public String getAddress(){
        
return this.address;
    }

    
public int compare(Object o1, Object o2){
        
return 0;
    }

    
public boolean equals(Object obj) {
        
boolean result = false;
        
if (obj instanceof Company){
            Company company 
= (Company) obj;
            
if (company.getId()==this.id && company.getName().equals(this.getName())
                
&& company.getAddress().equals(this.getAddress()))
                result 
= true;
        }

        
return result;
    }

}

测试代码:

package demo;

import org.apache.commons.jxpath.JXPathContext;

import demo.bean.Company;

public class JxPathDemo {

    
public static void main(String[] args) {
        
        
//实例化一个Company对象
        Company company = new Company();
        
//设置该对象的各个属性
        company.setId(1);
        company.setName(
"vivianj组织");
        company.setAddress(
"www.vivianj.org");
        
//初始化JXPath的上下文环境
        JXPathContext context = JXPathContext.newContext(company);
        
//使用XPath语法来访问该对象的属性
        
//getValue方法的参数"name"、"id"、"address"使用了XPath的语法,
        
//他们分别代表要访问company对象的属性name、id、address
        String name = (String)context.getValue("name");
        Integer id 
= (Integer) context.getValue("id");
        String address 
= (String)context.getValue("address");

        System.out.println(
"name: " + name);
        System.out.println(
"id: " + id);
        System.out.println(
"address: " + address);
    }

}

B.Lenient 访问模式

package demo;

import org.apache.commons.jxpath.JXPathContext;

import demo.bean.Company;

public class LenientDemo {

    
public static void main(String[] args) {
        
        
//实例化一个Company对象
        Company company = new Company();
        
//设置该对象的各个属性
        company.setId(1);
        company.setName(
"vivianj组织");
        company.setAddress(
"www.vivianj.org");
        
//初始化JXPath的上下文环境
        JXPathContext context = JXPathContext.newContext(company);
        
//通知系统使用Lenient 访问模式
        context.setLenient(true);
        
//使用XPath语法来访问该对象的属性
        String name1 = (String)context.getValue("name1");
        
        System.out.println(
"name1: " + name1);
    }

}

[注] name1 不是Company类的属性,但是由于使用了Lenient 访问模式,所以系统返回null。

C.多种访问方式,新建Association类如下:

package demo.bean;

import java.util.ArrayList;
import java.util.Collection;

public class Association {

    
private Company company;

    
public Company getCompany() {
        
return this.company;
    }


    
public void setCompany(Company p_company) {
        
this.company = p_company;
    }


    
public Company[] getCompanysInArray() {

        Company[] companysInArray 
= new Company[5];
        
for (int i = 0; i < 5; i++{
            
//实例化新的Company对象
            Company comp = new Company();
            comp.setId(i);
            comp.setName(
"Name" + i);
            comp.setAddress(
"address" + i);
            
//将实例化的对象赋值给到数组的对应元素
            companysInArray[i] = comp;
        }

        
return companysInArray;
    }


    
public Collection<Company> getCompanysInCollection() {

        ArrayList
<Company> companysInCollection = new ArrayList<Company>();
        
for (int i = 0; i < 5; i++{
            
//实例化新的Company对象
            Company comp = new Company();
            comp.setId(i);
            comp.setName(
"Name" + i);
            comp.setAddress(
"address" + i);
            
//将实例化的对象增加到Collection中
            companysInCollection.add(comp);
        }

        
return companysInCollection;
    }

}

测试代码:

package demo;

import java.util.Iterator;

import org.apache.commons.jxpath.JXPathContext;

import demo.bean.Association;
import demo.bean.Company;

public class AssociationDemo {
/*
    public static void main(String[] args) {
        
        //实例化Association类
        Association association = new Association();
        //实例化Company类
        Company company = new Company();
        company.setId(1);
        company.setName("vivianj组织");
        company.setAddress("www.vivianj.org");
        //设置Association对象的company属性
        association.setCompany(company);
        //初始化JXPath上下文
        JXPathContext context = JXPathContext.newContext(association);
        //使用Lenient访问模式访问嵌套属性
        context.setLenient(true);
        //通过JXPath方法获得指定属性的值
        //其中getValue方法的参数"company/name"的
        //第一部分company代表Association的属性company,
        //第二部分("/"符号后面的部分)name代表是company对象的属性
        String name = (String) context.getValue("company/name");

        System.out.println("name: " + name);
    }
*/

/*
    public static void main(String[] args) {
        
        //实例化Association类
        Association association = new Association();
        //初始化JXPath上下文
        JXPathContext context = JXPathContext.newContext(association);
        //使用Lenient访问模式访问嵌套属性
        context.setLenient(true);
        //通过JXPath语法访问数组下标为4的记录的name属性
        //getValue方法的参数"companysInArray[5]/name"中的
        //部分companysInArray是Association的属性,
        //5代表访问数组中第5个元素,name表示第五个元素的属性名
        String name = (String) context.getValue("companysInArray[5]/name");
        System.out.println("companysInArray name:" + name);
        //通过XPath语法访问集合中第4条记录的name属性
        //getValue方法的参数" companysInColletion[5]/name"中的
        //部分companysInColletion是Association的属性名,
        //5代表访问集合中第5个元素,name表示第五个元素的属性名
        name = (String) context.getValue("companysInCollection[5]/name");
        System.out.println("companysInColletion name:" + name);
    }
*/

/*
 * 
    public static void main(String[] args) {
        
        //实例化Association类
        Association association = new Association();
        //实例化JXPath上下文
        JXPathContext context = JXPathContext.newContext(association);
        //获得数组中下标大于3的所有记录
        //iterator方法的参数companysInArray [position() > 3]使用了XPath的语法
        //其中的companysInArray是Association对象的属性,他是一个数组
        // position()是XPath中的内置函数,获得记录在数组中的下标
        Iterator<?> companysInArray = context.iterate("companysInArray [position() > 3]");
        while (companysInArray.hasNext()) {
            Company company = (Company) companysInArray.next();
            System.out.println(company.getAddress());
        }
        System.out.println("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
        
        //获得集合中所处位置大于3的所有记录
        //iterator方法的参数companysInCollection [position() > 3]使用了XPath的语法
        //其中的companysInCollection是Association对象的属性
        //他是一个Collection类型或者是其子类型的一个实例
        //position()是XPath中的内置函数,获得记录在集合中的位置
        Iterator<?> companysInCollection = context.iterate("companysInCollection [position() > 3]");
        while (companysInCollection.hasNext()) {
            Company company = (Company) companysInCollection.next();
            System.out.println(company.getAddress());
        }
        System.out.println("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
    }
*/

    
public static void main(String[] args) {
        
        
//实例化Association类
        Association association = new Association();
        
//实例化JXPath上下文
        JXPathContext context = JXPathContext.newContext(association);
        
//获得数组中对象的name属性为'name3'的所有对象
        
//iterator方法的参数companysInArray [name='name3']使用了XPath的语法
        
//其中的companysInArray是Association对象的属性,他是一个数组
        
//name='name3'是条件表达式,表示返回对象的name属性值必须是name3
        Iterator<?> companysInArray = context.iterate("companysInArray [name='Name3']");
        
while (companysInArray.hasNext()) {
            Company company 
= (Company) companysInArray.next();
            System.out.println(company.getName());
        }

        System.out.println(
"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
        
//获得集合中对象的name属性为'name2'的所有对象
        
//iterator方法的参数companysInCollection [name='name3']使用了XPath的语法
        
//其中的companysInCollection是Association对象的属性
        
//他是一个Collection类型或者是其子类型的一个实例
        
//name='name3'是条件表达式,表示返回对象的name属性值必须是name3
        Iterator<?> companysInCollection = context.iterate("companysInCollection [last()]");
        
while (companysInCollection.hasNext()) {
            Company company 
= (Company) companysInCollection.next();
            System.out.println(company.getName());
        }

        System.out.println(
"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
    }

}

D.访问Map对象的内容,新建MyMapSource类:

package demo.bean;

import java.util.HashMap;
import java.util.Map;

public class MyMapSource {

    
private Map<String, Object> map = new HashMap<String, Object>();

    
public MyMapSource() {
        map.put(
"id"new Integer(5));
        map.put(
"name""name");
    }


    
public Map<String, Object> getMapSource() {
        
return this.map;
    }

}

测试代码:

package demo;

import org.apache.commons.jxpath.JXPathContext;

import demo.bean.MyMapSource;

public class MapDemo {

    
public static void main(String[] args) {
        
        
//实例化MyMapSource对象
        MyMapSource myMapSource = new MyMapSource();
        
//实例化JXPath上下文
        JXPathContext context = JXPathContext.newContext(myMapSource);
        
//通过JXPath访问Map对象的内容
        
// getValue方法的参数使用了XPath语法
        
// mapSource/id中的mapSource表示MyMapSource对象的属性,
        
//他是一个Map类型的对象,id表示获取该Map对象的id字段
        Integer id = (Integer) context.getValue("mapSource/id");
        System.out.println(
"id: " + id);
    }

}

E.访问XML文件,新建Companys类:

package demo;

import java.net.URL;

import org.apache.commons.jxpath.Container;
import org.apache.commons.jxpath.xml.DocumentContainer;

public class Companys {

    
private Container companys = null;

    
public Container getCompanys() {
        
if (companys == null{
            URL url 
= getClass().getResource("jxpath.xml");
            companys 
= new DocumentContainer(url);
        }

        
return companys;
    }

}

新建jxpath.xml文件:

<?xml version="1.0" ?>
<companys>
    
<company id="101">
        
<name>sun</name>
        
<address>
            
<street>18 #,WenShan Road</street>
        
</address>
    
</company>
    
<company id="102">
        
<name>ibm</name>
        
<address>
            
<street>18 #,WenEr Road</street>
        
</address>
    
</company>
</companys>

测试代码:

package demo;

import org.apache.commons.jxpath.JXPathContext;

public class XmlDemo {

    
public static void main(String[] args) {

        
//实例化Companys对象
        Companys companys = new Companys();
        
//初始化JXPath上下文
        JXPathContext context = JXPathContext.newContext(companys);
        
//获得指定记录的子元素的内容
        /*getValue方法的参数
        "companys/companys/company[@id = '101']/address/street"
        使用了XPath语法
        其中的第一个companys表示访问Companys对象的companys属性
        第二个companys表示访问XML数据中的companys元素
        company、address、street都是xml中的元素的名字
        @id = '101'是一个条件表达式,表示符合条件的company元素的id属性必须是101
         
*/

        System.out.println(
"street=" + (String) context.getValue("companys/companys/company[@id = '101']/address/street"));
        
//通过JXPath获取xml元素的属性的值
        System.out.println("id=" + context.getValue("companys/companys/company[@id = '101']/@id"));
        
//通过JXPath获取xml元素的子元素的值
        System.out.println("p_id="+ context.getValue("companys/companys/company[name = 'sun']/name"));

    }

}

详细请参阅:
http://www.myfaq.com.cn/A200508/2005-08-05/183498.html
http://c.lstc.edu.cn:8090/kj/Manfeel/w3pop/xpath_operators.asp.htm
http://www.ibm.com/developerworks/cn/xml/x-wxxm35.html

原创粉丝点击