/ / Problem XPath przy użyciu JDOM / Jaxen - java, xml, xpath

Problem XPath przy użyciu JDOM / Jaxen - java, xml, xpath

W moim programie pobieram plik xml, pokazany poniżej.

Zadanie powinno być bardzo proste, aby wyodrębnić tylko wszystkie atrybuty waluta i stopa.

Używam JDOM i zacząłem w następujący sposób:

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);
}
}

Przetestowałem kilka ścieżek, aby uzyskać wpisy, ale to nie działa.

<?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>

Odpowiedzi:

6 dla odpowiedzi № 1

Musisz powiązać przestrzenie nazw z obiektem Xpath. Powinieneś utworzyć obiekt xpath w ten sposób (Musiałem dodać nowy wpis Cube do twojego xpath):

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

następnie dodaj do niego swoje deklaracje przestrzeni nazw:

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

W rzeczywistości element Envelope ma "http: // www.gesmes.org/xml/2002-08-01 "namespace uri, podczas gdy wszystkie elementy Cube mają" uran nazwany przez "http://www.ecb.int/vocabulary/2002-08-01/eurofxref", zadeklarowany jako domyślny obszar nazw Możesz użyć przedrostka przestrzeni nazw w swoim xpath, ale URI musi się zgadzać.
Następnie przeszukaj dokument w ten sposób, używając utworzonej ścieżki Xpath:

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

Przetestowałem ten kod z twoim xml i produkuje on następujące dane wyjściowe:

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 dla odpowiedzi nr 2

Masz przestrzenie nazw w twoim xml, o których nie powiedziałeś silnika XPath. Musisz użyć a javax.xml.namespace.NamespaceContext. Widzieć Ten artykuł dla pełnego wyjaśnienia i przewodnika, aby działało.