【问题标题】:Can't get JAXB to parse XML from Yahoo! Finance to Java无法让 JAXB 解析来自 Yahoo! 的 XML!财务到 Java
【发布时间】:2015-11-09 22:11:55
【问题描述】:

我试图弄清楚如何在 Eclipse 中将以下 XML 解析为 Java 类: http://finance.yahoo.com/webservice/v1/symbols/aapl/quote?format=xml&view=detail

我在this tutorial 之后尝试了它,但我无法让它工作。

我想要解析名称(Apple Inc.)和价格。 这是我的报价类(尝试使用和不使用注释参数):

import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Quote")
public class Quote implements Serializable {
    private String name;
    private Integer price;

    public String getName() {
        return name;
    }

    @XmlElement(name = "name")
    public void setName(String name) {
        this.name = name;
    }

    public Integer getPrice() {
        return price;
    }

    @XmlElement(name = "price")
    public void setPrice(Integer price) {
        this.price = price;
    }

这是我的助手类的相关部分,计划将多个引号存储在一个集合中:

import javax.xml.bind.JAXB;
...
            
public class QuoteService {
    Set<Quote> quotes = new LinkedHashSet<>();
                            
    public void initializeQuotes() {
       String s = "http://finance.yahoo.com/webservice/v1/symbols/aapl/quote?format=xml&view=detail";
                                     
       try {
          URL url = new URL(s);
          Quote quote = JAXB.unmarshal(url, Quote.class);
          quotes.add(quote);
       } 

       catch (MalformedURLException e) {
          e.printStackTrace();
       }
        
    public Set<Quote> getQuotes() {
       return quotes;
    }
        
}

执行 initializeQuotes() 后,我没有收到任何异常。但是,在使用以下代码打印所有内容后:

System.out.println(quoteService.getQuotes());

for (Quote quote : quoteService.getQuotes()) {
   System.out.println(quote.getName());
   System.out.println(quote.getPrice());
}

我明白了:

[quote.core.api.Quote@e36bb2a]

因此,很明显,创建了一个报价类,但它的属性(名称和价格)是空的,而不是包含相应的 XML 值(“Apple Inc.”和当前价格)。 我做错了什么?

【问题讨论】:

  • 为什么不直接使用这个?:financequotes-api.com
  • 如果我无法让解析工作,这似乎也能完成这项工作。感谢您的提醒!

标签: java xml xml-parsing jaxb yahoo-finance


【解决方案1】:

如果我转到代码中的 URL,返回的 XML 是一个“列表”对象,该对象包含一个“资源”对象,该对象包含一个“资源”对象列表。这甚至与您的 Java 对象“引用”类不匹配。

最好从描述要转换的 XML 的模式开始,然后通过 xjc 运行该模式,xjc 是 XML 到 Java 的编译器。这将为您生成适当的带注释的 java 对象,您可以将其传递给 JAXB marshaller/unmarshaller。 (我知道 Netbeans IDE 将为您自动执行运行 xjc 的步骤;其他 IDE 也可能会这样做。)如果您愿意,您可以开始自定义它生成的 java 类 - 但如果稍后您将失去所有这些架构更改,您必须重新生成 java 代码。

现在,在您的情况下,您从 XML 开始,也许您没有架构。但是有办法解决这个问题。转到 http://www.freeformatter.com/xsd-generator.html 并粘贴来自 Yahoo 站点的 XML。这将为您生成与您获得的 XML 匹配的 XML 模式。那应该让你继续前进。

我浏览了您发布的 URL,第一次尝试就成功了。我实际上并没有测试解组结果,但它应该可以正常工作。

【讨论】:

  • 感谢您的回复,我应该提到我必须实现一个重新加载 XML 的选项,即通过最终应用程序中的刷新按钮,因为它应该能够显示真实-时间报价。此外,为了检索不同的股票,URL 会有所不同。因此,我必须找到一种方法将 XML 存储在变量中,然后通过 Java 代码将其转换为 XSD。我找到了 xsd-gen (github.com/wiztools/xsd-gen),但我读过它可能会导致问题。有什么好方法可以完成这项工作吗?
  • 尝试动态创建 XSD 不是一个好主意。 XSD 描述了您的软件必须读取和处理的 XML 数据的结构。您希望您的软件自动计算出如何处理新结构?这正在进入人工智能领域。但不用担心,您可以随时提取新的 XML 并对其进行处理。您只需要提前弄清楚您将要从中提取数据的各种来源的架构(即 XSD)是什么,然后对您的软件进行编程以相应地处理该数据。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 2013-04-30
  • 2012-12-05
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 2018-01-15
相关资源
最近更新 更多