парсинг xml с помощью dom4j

Моя структура XML выглядит следующим образом:

<rss>
     <channel>
         <yweather:location city="Paris" region="" country="France"/>
         <yweather:units temperature="C" distance="km" pressure="mb" speed="km/h"/>
         <yweather:wind chill="-1" direction="40" speed="11.27"/>
         <yweather:atmosphere humidity="87" visibility="9.99" pressure="1015.92" rising="0"/>
         <yweather:astronomy sunrise="8:30 am" sunset="4:54 pm"/>
     </channel>
</rss>

когда я пытался разобрать его с помощью dom4j

 SAXReader xmlReader = createXmlReader();
 Document doc = null;
 doc = xmlReader.read( inputStream );//inputStream is input of function
 log.info(doc.valueOf("/rss/channel/yweather:location/@city"));

 private SAXReader createXmlReader() {
    Map<String,String> uris = new HashMap<String,String>();
    uris.put( "yweather", "http://xml.weather.yahoo.com/ns/rss/1.0" );
    uris.put( "geo", "http://www.w3.org/2003/01/geo/wgs84_pos#" );

    DocumentFactory factory = new DocumentFactory();
    factory.setXPathNamespaceURIs( uris );

    SAXReader xmlReader = new SAXReader();
    xmlReader.setDocumentFactory( factory );
    return xmlReader;
}

Но я ничего не получил в cmd, но когда я печатаю doc.asXML(), моя структура XML печатается правильно!


person D3GAN    schedule 08.12.2012    source источник


Ответы (2)


У вас есть необъявленный префикс пространства имен как в XML, так и в вашем XPath.

Добавьте соответствующее объявление xmlns:yweather в свой XML и используйте setNamespaceURIs, чтобы сделать его доступным для вашего XPath.

person Paul Butcher    schedule 08.12.2012
comment
Это URL-адрес, из которого я получаю этот XML: weather.yahooapis.com/forecastrss?w =615702&u=c - person D3GAN; 08.12.2012
comment
Итак, в исходном XML есть объявление пространства имен, но вы по-прежнему не делаете префикс yweather: доступным для вашего XPath. Что произойдет, когда вы это исправите? - person Paul Butcher; 08.12.2012
comment
В XML есть два пространства имен (как вы можете видеть, если щелкнете по этой ссылке weather.yahooapis.com/forecastrss?w=615702&u=c). Я добавляю их оба: uris.put( yweather, xml.weather.yahoo.com/ns/rss/1.0 ); uris.put(гео, w3.org/2003/01/geo/wgs84_pos#< /а>); - person D3GAN; 08.12.2012
comment
И это помогло, или вы все еще боретесь? - person Paul Butcher; 08.12.2012
comment
Нет, я все еще борюсь! :( Я изменил свой API погоды на этот free.worldweatheronline.com/feed/, но я все равно не могу разобрать его с помощью dom4j - person D3GAN; 09.12.2012

@ D3GAN Все, что вы написали, в порядке. Нет проблем с кодом. Я только что попробовал. Проблема в том, что у вас НЕТ всех необходимых библиотек в вашем коде.

Вы должны добавить библиотеку jaxen в свой путь к классам, вы, вероятно, получаете NoClassdefFoundError. Исходный дистрибутив dom4j содержит jaxen.jar (в папке зависимостей).

Я сделал ту же ошибку. Я только что добавил dom4j, и код не работал. Я получал пустой документ. Но когда я добавил зависимость от jaxen, все заработало нормально.

Если вы не знаете, как установить файлы JAR, вы можете перейти сюда: http://www.wikihow.com/Add-JARs-to-Project-Build-Paths-in-Eclipse-%28Java%29

person vinzzz    schedule 25.04.2014