使用JDOM / Jaxen的XPath问题

时间:2012-01-19 09:06:25

标签: java xml xpath

在我的程序中,我正在下载xml文件,如下所示。

任务应该非常简单,只需提取所有属性 货币和利率。

我正在使用JDOM并开始如下:

try {
    // TODO code application logic here
    SAXBuilder builder = new SAXBuilder();
    org.jdom.Document doc = builder.build("test.xml");
    List<?> all = XPath.selectNodes(doc, "/Envelope/Cube/Cube/@currency");
    for(Object o : all) {
        Attribute att = (Attribute) o;
        System.out.println("ausgbabe: " + att);
    }
}

已经测试了几条路径来获取条目,但它无法正常工作。

<?xml version="1.0" encoding="UTF-8"?> 
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"> 
    <gesmes:subject>Reference rates</gesmes:subject> 
    <gesmes:Sender> 
        <gesmes:name>European Central Bank</gesmes:name> 
    </gesmes:Sender> 
    <Cube> 
        <Cube time='2012-01-17'> 
            <Cube currency='USD' rate='1.2790'/> 
            <Cube currency='JPY' rate='98.20'/> 
            <Cube currency='BGN' rate='1.9558'/> 
            <Cube currency='CZK' rate='25.650'/> 
            <Cube currency='DKK' rate='7.4353'/> 
            <Cube currency='GBP' rate='0.83045'/> 
        </Cube> 
    </Cube> 
</gesmes:Envelope>

2 个答案:

答案 0 :(得分:6)

您需要将命名空间绑定到xpath对象。您应该像这样创建xpath对象(我必须在您的xpath中添加一个新的Cube条目):

XPath xpath = XPath.newInstance("/gesmes:Envelope/root:Cube/root:Cube/root:Cube/@currency");

然后将命名空间声明添加到它:

xpath.addNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");
xpath.addNamespace("root", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");

实际上,Envelope元素具有“http://www.gesmes.org/xml/2002-08-01”命名空间uri,而所有Cube元素都具有“http://www.ecb.int” / vocabulary / 2002-08-01 / eurofxref“namespace uri,声明为默认名称空间。您可以在xpath中使用所需的名称空间前缀,但uri必须匹配 然后使用您创建的xpath搜索这样的文档:

List<?> all = xpath.selectNodes(doc);

我用你的xml测试了这段代码,它产生了以下输出:

ausgbabe: [Attribute: currency="USD"]
ausgbabe: [Attribute: currency="JPY"]
ausgbabe: [Attribute: currency="BGN"]
ausgbabe: [Attribute: currency="CZK"]
ausgbabe: [Attribute: currency="DKK"]
ausgbabe: [Attribute: currency="GBP"]

答案 1 :(得分:1)

你的xml中有没有告诉XPath引擎的命名空间。您需要使用javax.xml.namespace.NamespaceContext。有关完整说明和指南,请参阅this article