Java 无法使用JDOM提取xml值元素&;Xpath

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(

我有一个方法(getSingleNodeValue()),当传递一个xpatch表达式时,它将提取“doc”中引用的xml文档中指定元素的值。假设此时的文档已初始化,如下所示,xmlInput是包含xml内容的缓冲区

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