1

我有一个方法 (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 的原因。

4

1 回答 1

2

问题在于 XML 名称空间:您的 XPath 查询首先选择默认名称空间中的“TOP4A”元素。但是,您的 XML 文件在“http://www.testurl.co.uk/enment/gqr/3232/1”命名空间中有一个“TOP4A”元素。

是否可以从 XML 中删除 xmlns?

于 2011-09-03T16:00:28.117 回答