После исследования в google я не нашел рабочего решения для этого. В книге «MAVEN by Example» используется пример погоды Yahoo. К сожалению, похоже, что Yahoo изменил свой интерфейс. Я пытался адаптировать код Java для этого, но получить это досадное исключение:XpathException в Java MAVEN пример Выражение использует префикс незанятого пространства имен
exec-maven-plugin:1.5.0:java
Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.5.0:java
Caused by: org.dom4j.XPathException:
Exception occurred evaluting XPath: /query/results/channel/yweather:location/@city.
Exception: XPath expression uses unbound namespace prefix yweather
сам XML-строка:
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="1" yahoo:created="2017-02-13T10:57:34Z" yahoo:lang="en-US">
<results>
<channel>
...
<yweather:location xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" city="Theale" country="United Kingdom" region=" England"/>
Всего XML может быть получена из:
https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%3D91731537
Мой код (согласно «MAVEN By Example» ebook, xpath и url, измененный для измененного Yahoo):
public Weather parse(InputStream inputStream) throws Exception {
Weather weather = new Weather();
SAXReader xmlReader = createXmlReader();
Document doc = xmlReader.read(inputStream);
weather.setCity(doc.valueOf ("//yweather:location/@city"));
// and several more, such as setCountry, setTemp
}
(я не эксперт XPath, поэтому я попытался
/query/results/channel/item/yweather:location/@city
, а также, на всякий случай, с тем же результатом.
XMLReader:
public InputStream retrieve(String woeid) throws Exception {
String url = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%3D"+woeid; // eg 91731537
URLConnection conn = new URL(url).openConnection();
return conn.getInputStream();
}
и класс погода просто набор добытчиками и сеттеров
Когда я пытаюсь это в this XML тестером, он прекрасно работает, но это может быть следствием XPATH-v2 vs Java v1.
Спасибо за подробное объяснение, я получил его сейчас, просто вставив предлагаемую функцию пространства имен-uri следующим образом: 'weather.setCity (doc.valueOf (" // * [namespace-uri() = 'http: //xml.weather.yahoo.com/ns/rss/1.0']/@city "));' На данный момент это служит цели, поскольку я пытаюсь узнать Maven, но мне нужно обновить себя с именами в XML, а также, поскольку я не могу заявить, что полностью понимаю примеры, которые вы дали .... Спасибо! – user3211098