posts - 165, comments - 198, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

jxpath 学习笔记

Posted on 2007-08-13 10:58 G_G 阅读(2185) 评论(1)  编辑  收藏 所属分类: Jakarta Commons
get set 参考 BeanUtil 包 和 Xpath
http://commons.apache.org/  的 jxpath User's Guide

类的加载
JXPathContext context = JXPathContext.newContext( obj );
//和 xpath 的 范围确定

一般取值 存值
String fName = (String)context.getValue("firstName"); //setValue
//参考 http://www.blogjava.net/Good-Game/archive/2007/08/10/135739.html

一般的统计和使用 c 为 list [id,name,.....]

        JXPathContext context = JXPathContext.newContext(c);
        System.out.println( context.getValue(
"count( .[name='oo' and id='1' ] )") ); //对象 name=oo 和 id=1的有多少个
System.out.println( context.getValue("sum( .[name='oo' and id='1' ]/id )") );//对象name=oo和id=1的所有id相加





得到集合
 Iterator threeBooks = context.iterate("books[position() < 4]");
//xpath 的位置函数 position 其他函数参考 http://www.w3.org/TR/xpath
//4 Core Function Library

xpath 使用
public class Employee {
    
private Map addressMap = new HashMap();
    {
        addressMap.put(
"home"new Address());
        addressMap.put(
"office"new Address());
    }
    
public Map getAddresses(){
       
return addressMap;
    }
    
 }
 String homeZipCode 
= (String)context. getValue("addresses[@name='home']/zipCode");
//使用的是 addressMap map 的 key = home 的Address类属性的 zipCode

xml 在程序 与 xpath 的切入点
    <?xml version="1.0" ?>
    
<vendor>
      
<location id="store101">
        
<address>
          
<street>Orchard Road</street>
        
</address>
      
</location>

      
<location id="store102">
        
<address>
          
<street>Tangerine Drive</street>
        
</address>
      
</location>
    
</vendor>

class Company {
    
private Container locations = null;

    
public Container getLocations(){
        
if (locations == null){
            URL url 
= getClass().getResource("Vendor.xml");
            locations 
= new XMLDocumentContainer(url);
        }
        
return locations;
    }
 }
 
 context 
= JXPathContext.newContext(new Company());
 
 String street 
= (String)context.getValue(
                
"locations/vendor/location[@id = 'store102']//street");
// 类Container的 属性 locations 头 vendor(xml内) .....

建立 Path工厂 就是 自定义字符串 得到 自定义类
 public class AddressFactory extends AbstractFactory {
    
public boolean createObject(JXPathContext context, Pointer pointer,
                                Object parent, String name, 
int index){
     
if ((parent instanceof Employee) && name.equals("address"){
       ((Employee)parent).setAddress(
new Address());
       
return true;
     }
     
return false;
   }
 }

 JXPathContext context 
= JXPathContext.newContext(emp);
 context.setFactory(
new AddressFactory());
 context.createPath(
"address");
 context.createPathAndSetValue(
"address/zipCode""90190");
// emp 类就是 createObject方法中的 Object
//运行解析到 address字符 就进入 if中


建立内参
 JXPathContext context = JXPathContext.newContext(auth);
 context.getVariables().declareVariable(
"index"new Integer(2));
 context.setValue("$index", new Integer(3));
 Book secondBook = (Book)context.getValue("books[$index]");
// $index 为 3

确定范围
Pointer 
JXPathContext context = JXPathContext.newContext(bean);
 Pointer addressPtr 
= context.getPointer("/employees[1]/addresses[2]");
 JXPathContext relativeContext 
= 
              context.getRelativeContext(addressPtr);

 String zipCode = (String)relativeContext.getValue("zipCode");
//可以用 xpath 确定范围 很好 呵呵


方法的联系应用
 public class Formats {
    
public static String date(Date d, String pattern){
        
return new SimpleDateFormat(pattern).format(d);
    }
    
 }                                                     
 context.setFunctions(
new ClassFunctions(Formats.class"format"));
//方法的设置 format
 
 context.getVariables().declareVariable(
"today"new Date());
 String today 
=
     (String)context.getValue(
"format:date($today, 'MM/dd/yyyy')");


心得: 代码可以写成什么样呢~~ (JXpath)


评论

# re: jxpath 学习笔记  回复  更多评论   

2007-09-05 17:26 by G_G
 1 2 3
 4 5 6
 7 8 9
 ...
 28 29 30




结果集


 sum( .[1]/num1 ) 会全加 不会就第一个 ?
 sum( .[num1=1]/*[contains(name(),'num')] ) 模糊查询使用  结果:6
 
 sum( .[num1=1]/*[contains(name(),'num')] ) + sum( .[num1=4]/*[contains(name(),'num')] ) 
 sum( .[num1=1 or num1=4]/*[contains(name(),'num')] )
 结果:21
 
 .[position()=last()]/num1  错误? 不支持 last()  等方法吗?
 .[last()]/num1  结果 1
 .[last()-1]/num1 错误  jxpath 对定位好象不太兼容 。
 
 
 substring-after('1999/04/01','/') 结果04/01
 
 .[num1=1]/*[name()='num1']  结果:1
 
 last()  结果:10
 
  .[num1=4]/*[string-length( name() )
<=4 ]  结果: 4 5 6 


只有注册用户登录后才能发表评论。


网站导航: