当XPath遇上NameSpace

在jdk5.0中,已经包含了对Xpath的支持,可一通过下面的代码得到Xpath

    XPathFactory  factory=XPathFactory.newInstance();
    XPath xPath=factory.newXPath();
    xPath.evaluate("xpaht_exp", dom/saxSource)//就可以得到任意节点的任意属性

 但是如果xml文件有多于1个的namespace,那么在使用xpath是要注意,xpath也必须使用namespace,可以通过下面的代码来指定xpath的命名空间

xPath.setNamespaceContext(getNameSpaceContext());
  private NamespaceContext getNameSpaceContext() {
    return new NamespaceContext() {
        public String getNamespaceURI(String prefix) {
          String uri;
          if (prefix.equals("ns1")){
            uri = "http://www.imsglobal.org/xsd/imscp_v1p1";
          }else if (prefix.equals("ns2")){
            uri = "http://www.imsglobal.org/xsd/imsmd_v1p2";
          }else if(prefix.equals("xsi")){
            uri = "http://www.w3.org/2001/XMLSchema-instance";
          }else{
            uri = null;
          }
          return uri;
        }
        public Iterator getPrefixes(String val) {return null;}
        public String getPrefix(String uri) {return null;}
        
      };
  }

 这样在些Xpath 表达式的时候就可以使用ns1,ns2这样的命名空间了,示例代码如下

assert xPath.evaluate("/ns1:manifest/@identifier", manifestSource).equals("[0000]_manifest");
assert xPath.evaluate("/ns1:manifest/ns1:resources/ns1:resource[1]/ns1:metadata/ns2:lom/ns2:general/ns2:language", manifestSource).equals("ENGLISH");

 这里有一篇详细的介绍 http://blog.davber.com/2006/09/17/xpath-with-namespaces-in-java/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值