Java 无法使用JDOM提取xml值元素&;Xpath
我有一个方法(getSingleNodeValue()),当传递一个xpatch表达式时,它将提取“doc”中引用的xml文档中指定元素的值。假设此时的文档已初始化,如下所示,xmlInput是包含xml内容的缓冲区Java 无法使用JDOM提取xml值元素&;Xpath,java,xml,xpath,jdom,Java,Xml,Xpath,Jdom,我有一个方法(getSingleNodeValue()),当传递一个xpatch表达式时,它将提取“doc”中引用的xml文档中指定元素的值。假设此时的文档已初始化,如下所示,xmlInput是包含xml内容的缓冲区 SAXBuilder builder = null; Document doc = null; XPath xpathInstance = null; doc = builder.build(new StringReader(
SAXBuilder builder = null;
Document doc = null;
XPath xpathInstance = null;
doc = builder.build(new StringReader(xmlInput));
调用该方法时,我传递以下xpath表达式
/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>
编辑
我已经运行了一些进一步的测试,似乎如果我删除名称空间url,它就可以工作了。还不知道为什么。有没有办法让它忽略名称空间
编辑
还请注意,上面的代码是在JDK1.4.1上实现的,因此我没有JDK更高版本的选项。这就是我必须坚持使用Jdom的原因 问题在于XML名称空间:XPath查询首先在默认名称空间中选择一个“TOP4A”元素。但是,您的XML文件在http://www.testurl.co.uk/enment/gqr/3232/1'名称空间
是否可以选择从XML中删除XMLN?如果可以将其表述为一个即将运行的失败单元测试,您可能会更容易得到答案。@Arnout Engelen,谢谢。请参阅编辑。不,xml文档将以我上面显示的格式接收,我无法修改它。我能告诉它忽略名称空间吗?我看到你被jdk1.4/jdom卡住了,所以你不能使用标准的javax.xml.parsers东西-不确定是否还有其他选择。我猜您可以考虑预处理输入和手动擦除命名空间,或者查看像DOM4J之类的其他XML库…
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