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