2012-02-25 3 views
4

이것은 처음으로 사이트에 질문을 올리는 것입니다. 저는 며칠 동안이 문제에 대한 해결책을 모색 해 왔으며 거기에 하나가있을 수도 있습니다. 그러나, 나는 나의 질문을 해결하기 위해 아무것도 찾을 수 없었습니다. 그래서 제게 많은 도움이되기를 바랍니다. 또한 나는 자바에서 최고가 아니기 때문에이 질문은 어리석게도 어리석은 짓이 될 수도 있습니다.API 피드 (Java)에서 XML 파싱하기

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 바인딩을 생성하는 것이 좋습니다. 당신은 자바 최고의 체크 아웃이 무료 온라인 책 "자바와 XML 처리"아니라고 언급 한 이후

http://www.ibiblio.org/xml/books/xmljava/

2

귀하의 XPath 식 (//aws:weather를) 네임 스페이스 접두사 (aws)를 포함하는 모든 네임 스페이스에 바인드되지 않도록 URI. javax.xml.xpath.XPath의 Javadoc에서 설명한 것처럼 "표현식의 QName은 setNamespaceContext (NamespaceContext nsContext)로 설정된 XPath 네임 스페이스 컨텍스트와 비교하여 해결됩니다." 따라서 표현식을 컴파일하기 전에 setNamespaceContext 메서드를 사용하여 네임 스페이스 컨텍스트를 설정해야합니다.

+0

사용할 NamespaceContext는 어떻게 결정합니까? – Astaar