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