我有一个方法(getSingleNodeValue()),当传递一个xpatch表达式时,将提取“doc”中引用的xml文档中指定元素的值。假设此时doc已初始化,如下所示,xmlInput是包含xml内容的缓冲区。
SAXBuilder builder = null;
Document doc = null;
XPath xpathInstance = null;
doc = builder.build(new StringReader(xmlInput));
当我调用该方法时,我传递了以下xpath xpression
/TOP4A/PERLODSUMDEC/TINPLD1/text()
这是方法。它基本上只需要一个xml缓冲区并使用xpath来提取值:
public static String getSingleNodeValue(String xpathExpr) throws Exception{
Text list = null;
try {
xpathInstance = XPath.newInstance(xpathExpr);
list = (Text) xpathInstance.selectSingleNode(doc);
} catch (JDOMException e) {
throw new Exception(e);
}catch (Exception e){
throw new Exception(e);
}
return list==null ? "?" : list.getText();
}
上述方法总是返回“?”即没有找到任何内容,所以'list'为空。 它看到的xml文档是
<TOP4A xmlns="http://www.testurl.co.uk/enment/gqr/3232/1">
<HEAD>
<Doc>ABCDUK1234</Doc>
</HEAD>
<PERLODSUMDEC>
<TINPLD1>10109000000000000</TINPLD1>
</PERLODSUMDEC>
</TOP4A>
同样的方法适用于其他xml文档,所以我不确定这个有什么特别之处。没有例外,所以xml是有效的xml。只是该方法总是将'list'设置为null。有什么想法吗?
好的建议,这是一个简单的运行程序,演示了上面的
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.xpath.*;
import java.io.IOException;
import java.io.StringReader;
public class XpathTest {
public static String getSingleNodeValue(String xpathExpr, String xmlInput) throws Exception{
Text list = null;
SAXBuilder builder = null;
Document doc = null;
XPath xpathInstance = null;
try {
builder = new SAXBuilder();
doc = builder.build(new StringReader(xmlInput));
xpathInstance = XPath.newInstance(xpathExpr);
list = (Text) xpathInstance.selectSingleNode(doc);
} catch (JDOMException e) {
throw new Exception(e);
}catch (Exception e){
throw new Exception(e);
}
return list==null ? "Nothing Found" : list.getText();
}
public static void main(String[] args){
String xmlInput1 = "<TOP4A xmlns=\"http://www.testurl.co.uk/enment/gqr/3232/1\"><HEAD><Doc>ABCDUK1234</Doc></HEAD><PERLODSUMDEC><TINPLD1>10109000000000000</TINPLD1></PERLODSUMDEC></TOP4A>";
String xpathExpr = "/TOP4A/PERLODSUMDEC/TINPLD1/text()";
XpathTest xp = new XpathTest();
try {
System.out.println(xp.getSingleNodeValue(xpathExpr, xmlInput1));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
当我运行上述内容时,输出为
Nothing found
我已经进行了一些进一步的测试,看来如果我删除了命名空间url它确实有效。不知道为什么。有什么办法可以告诉它忽略命名空间吗?
请注意,上面的内容是在JDK1.4.1上实现的,所以我没有JDK更高版本的选项。这就是我不得不坚持使用Jdom的原因。
答案 0 :(得分:2)
问题在于XML命名空间:您的XPath查询首先在默认命名空间中选择“TOP4A”元素。但是,您的XML文件在'http://www.testurl.co.uk/enment/gqr/3232/1'命名空间中有一个'TOP4A'元素。
是否可以从XML中删除xmlns?