使用JDom的javaxpath
在下面的代码中,我试图使用XPath访问我的“handler”XML元素,但我运气不好,“elemHandler”元素总是空的。有谁能和我分享一下显而易见的解决办法吗?提前谢谢
import java.io.IOException;
import java.io.StringReader;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
public class XPathTest {
private static String jobString = "<job name=\"Workflow.JOB\">" +
" <handler name=\"xslt.converter\"/>" +
" <handler name=\"openoffice.renderer\">" +
" <opts input=\"ODS\" output=\"PDF\"/>" +
" </handler>" +
"</job>";
public static void main(String[] args) {
try {
Element elemJobInfo = new SAXBuilder().build(new StringReader(jobString)).detachRootElement();
XPath handlerExpression = XPath.newInstance("//stp:handler[2]");
handlerExpression.addNamespace("stp", "http://service.mine.org/dgs");
Element elemHandler = (Element) handlerExpression.selectSingleNode(elemJobInfo);
jobString = elemHandler.toString();
}
catch (IOException e) {
System.out.println("Failure: " + e);
}
catch (JDOMException e) {
System.out.println("Failure: " + e);
}
catch (Exception e) {
System.out.println("Failure: " + e);
}
}
}
# 1 楼答案
XPath表达式所针对的XML文档:
//stp:handler[2]
已计算,没有默认或声明的命名空间,并且所有节点都位于“无命名空间”中。
"http://service.mine.org/dgs"
命名空间中没有任何节点。除非在实际情况中使用另一个XML文档,否则上述表达式不能选择任何节点,这正是您得到的结果如果您正在使用一个没有显示的文档,而该文档实际上有一个默认名称空间,那么很可能是您在Java代码中错误地拼写了名称空间
另外,请尝试XPath表达式的这种变体(带或不带名称空间前缀):
(//stp:handler)[2]
# 2 楼答案
stp
名称空间是怎么回事?jobString
中的XML不引用任何名称空间。你试过没有前缀的吗