Проблема XPath с использованием JDOM / Jaxen - PullRequest
1 голос
/ 19 января 2012

В моей программе я загружаю XML-файл, показанный ниже.

Задача должна быть очень простой, чтобы извлечь только все атрибуты валюты и курса.началось следующим образом:

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 ]

6 голосов
/ 19 января 2012

Вам необходимо привязать пространства имен к вашему объекту xpath. Вы должны создать объект xpath следующим образом ( Мне нужно было добавить новую запись Cube в ваш xpath):

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" пространство имен 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 голос
/ 19 января 2012

В вашем xml есть пространства имен, о которых вы не сообщили движку XPath.Вам нужно использовать javax.xml.namespace.NamespaceContext.См. эту статью для полного объяснения и руководства, чтобы заставить его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...