在我的程序中,我正在下载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>
答案 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。