2012-02-25 13 views
4

これは初めての質問です。私は数日間このための解決策を探しており、そこに1つがあるかもしれません。しかし、私は私の質問を解決するために何かを見つけることができていないので、私はたくさんのあなたが私を助けることができることを望んでいます。また、私はJavaで最高ではないので、この質問はばかげてばかげてしまうかもしれません。APIフィードからXMLを解析する(Java)

urlからweather XMLファイルを解析しようとしていますが、引き続きXPathExpressionエラーが発生します。

public class WeatherBugAPI { 

private XPath xpath = XPathFactory.newInstance().newXPath(); 


String API_KEY = "A***************"; 

public void getLiveWeather(String zipcode) throws Exception{ 
     DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
     builderFactory.setNamespaceAware(true); 
     DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
     URL xml = new 
     URL("http://A**********.api.wxbug.net/getLiveCompactWeatherRSS.aspx?acode=A**********&zipcode=" + zipcode); 
    try{ 
     InputStream is = xml.openStream(); 
     Document document = builder.parse(is); 
     XPathExpression expr = xpath.compile("//aws:weather"); 
     Node node = (Node)xpath.evaluate("//aws:weather", is, XPathConstants.NODE); 

     LiveWeather weather = new LiveWeather(xpath, node); 
     System.out.println(weather); 

    } catch(XPathExpressionException e){ 
     System.out.println("Failed to parse forcast!"); 
     e.printStackTrace(); 
    } 
    } 
} 

私のLiveWeatherクラスには、さまざまな属性すべてについて以下のような文章があります。 (。それらのトンをTheresの)

stationZipcode = (String)xpath.evaluate("//aws:city-state/@zipcode", node, XPathConstants.STRING); 

、最後にスタックトレース:

Failed to parse forcast! 

javax.xml.transform.TransformerException: Unable to evaluate expression using this context 
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:363) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:213) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:275) 
    at WeatherBugAPI.getLiveWeather(WeatherBugAPI.java:36) 
    at test.main(test.java:5) 
Caused by: java.lang.RuntimeException: Unable to evaluate expression using this context 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(NodeSequence.java:212) 
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(LocPathIterator.java:210) 
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:335) 
    ... 4 more 
--------- 
java.lang.RuntimeException: Unable to evaluate expression using this context 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(NodeSequence.java:212) 
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(LocPathIterator.java:210) 
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:335) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:213) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:275) 
    at WeatherBugAPI.getLiveWeather(WeatherBugAPI.java:36) 
    at test.main(test.java:5) 
--------------- linked to ------------------ 
javax.xml.xpath.XPathExpressionException 
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:289) 
    at WeatherBugAPI.getLiveWeather(WeatherBugAPI.java:36) 
    at test.main(test.java:5) 
Caused by: javax.xml.transform.TransformerException: Unable to evaluate expression using this context 
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:363) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:213) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:275) 
    ... 2 more 
Caused by: java.lang.RuntimeException: Unable to evaluate expression using this context 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(NodeSequence.java:212) 
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(LocPathIterator.java:210) 
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:335) 
    ... 4 more 

私はおそらく必要になる場合があります任意の情報を含めることを試みました。アドバイスをいただきありがとうございます。この質問には既にお答えいただきまして申し訳ありません。

+0

返されたXMLをキャプチャし、XMLエディタに読み込んでXPath式を実行し、XPath式ではなくJavaが問題であることを確認できるように、XPath式が動作することをテストしましたか? – ams

答えて

0

構文解析しようとしているXML文書のスキーマがある場合は、XML文書全体をJavaオブジェクトグラフに変換できるように、スキーマからJAXBバインディングを生成することを検討してください。

あなたのJavaは、この無料のオンラインブックの「Javaを使用したXMLの処理」最高のチェックアウトではありませんhttp://www.ibiblio.org/xml/books/xmljava/

2

あなたのXPath式(//aws:weather)は任意の名前空間にバインドされていない名前空間接頭辞(aws)が含まれていることを述べたので、 URI。 javax.xml.xpath.XPathのJavadocで説明したように、式のQNamesはsetNamespaceContext(NamespaceContext nsContext)で設定されたXPath名前空間コンテキストに対して解決されます。したがって、式をコンパイルする前にネームスペースコンテキストを確立するには、setNamespaceContextメソッドを使用する必要があります。

+0

どのNamespaceContextを使用するかはどのように決定しますか? – Astaar