当XPath遇上NameSpace

  • Post author:
  • Post category:其他


在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/