【问题标题】:Parsing XML from API feed (Java)从 API 提要解析 XML (Java)
【发布时间】:2012-02-25 07:47:07
【问题描述】:

这是我第一次在网站上发布问题。这几天我一直在寻找解决方案,可能有一个解决方案。但是,我一直无法找到任何东西来解决我的问题,所以我希望你们能帮助我。另外,我不是最擅长java的,所以这个问题最终可能会变得非常愚蠢。

我正在尝试从 url 解析天气 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 类对所有各种属性都有类似于下面的语句。 (有很多。)

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

【问题讨论】:

  • 您是否测试过您的 XPath 表达式是否有效,购买捕获返回的 XML,加载到 XML 编辑器并在那里执行 XPath 表达式,这样您就可以确定问题是 Java 而不是 XPath 表达式?跨度>

标签: java xml url xml-parsing


【解决方案1】:

您的 XPath 表达式 (//aws:weather) 包含未绑定到任何命名空间 URI 的命名空间前缀 (aws)。正如javax.xml.xpath.XPath 的 Javadoc 中所解释的,“表达式中的 QNames 是根据使用 setNamespaceContext(NamespaceContext nsContext) 设置的 XPath 命名空间上下文来解析的”。因此在编译表达式之前需要使用setNamespaceContext方法建立命名空间上下文。

【讨论】:

  • 如何确定使用哪个 NamespaceContext?
【解决方案2】:

如果您有一个要解析的 XML 文档的架构,您可能需要考虑从该架构生成一个 JAXB 绑定,这样您就可以将整个 XML 文档转换为 Java 对象图。

既然您提到您的 Java 不是最好的,请查看这本免费的在线书籍“使用 Java 处理 XML”http://www.ibiblio.org/xml/books/xmljava/

【讨论】:

    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多