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