java - 无法让 JAXB 解析来自 Yahoo! 的 XML金融到 java

标签 java xml xml-parsing jaxb yahoo-finance

我试图弄清楚如何在 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]

null

null

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

最佳答案

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

您最好从描述要转换的 XML 的模式开始,然后通过 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 模式。这应该能让你继续前进。

我针对您发布的网址运行了此操作,并且第一次尝试就成功了。我实际上没有测试解码结果,但它应该可以正常工作。

关于java - 无法让 JAXB 解析来自 Yahoo! 的 XML金融到 java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33619261/

相关文章:

java - 用于非常大的 XML 文件的 SAX 解析器

python - xml:从 iterparse 元素获取父属性

java - 如何从底部导航中删除标题

java - 使用 Keytool 将 EKU 添加到 CSR?

android - 更改 Android kitkat 上的状态栏颜色

python - lxml etree 在之前找到最接近的元素

php - 通过php表单修改我的xml文件

java - ZMQ - 具有多个前端服务实例和后端工作人员的请求/响应

java - 为什么我的应用程序无法启动(使用 hibernate 搜索配置)?

java - 可以在商业应用程序中使用 SimpleXML for Android 吗?