有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:Jax读写xml,类混淆

您好,我是xml读写新手,不确定我读得是否正确。我正在使用jaxb api 2.1版的Java内核。我想做的基本上是创建产品对象,并基于此xml将它们写入不同的文件。问题是我不知道如何标记字段 我是否只需要创建一个订单类,并将产品添加为内部字段的包装器,还是还需要创建一个产品类? 这对我来说很困惑,因为产品是内部订单,但它就像是内部其他标签的包装。 我在网上找到了几个教程,但没有一个能处理对象列表,大多数示例都包含简单的字符串字段或字符串数组。所以我不知道如何处理这个问题

任何帮助都将不胜感激。 多谢各位

<orders>
    <order created='2012-07-12T15:29:33.000' ID='2343'>
        <product>
            <description>Sony 54.6" (Diag) Xbr Hx929 Internet Tv</description>
            <gtin>00027242816657</gtin>
            <price currency="USD">2999.99</price>
            <supplier>Sony</supplier>
        </product>
        <product>
            <description>Apple iPad 2 with Wi-Fi 16GB - iOS 5 - Black</description>
            <gtin>00885909464517</gtin>
            <price currency="USD">399.0</price>
            <supplier>Apple</supplier>
        </product>
        <product>
            <description>Sony NWZ-E464 8GB E Series Walkman Video MP3 Player Blue</description>
            <gtin>00027242831438</gtin>
            <price currency="USD">91.99</price>
            <supplier>Sony</supplier>
        </product>
    </order>
    <order created='2012-07-13T16:02:22.000' ID='2344'>
        <product>
            <description>Apple MacBook Air A 11.6" Mac OS X v10.7 Lion MacBook</description>
            <gtin>00885909464043</gtin>
            <price currency="USD">1149.0</price>
            <supplier>Apple</supplier>
        </product>
        <product>
            <description>Panasonic TC-L47E50 47" Smart TV Viera E50 Series LED HDTV</description>
            <gtin>00885170076471</gtin>
            <price currency="USD">999.99</price>
            <supplier>Panasonic</supplier>
        </product>
    </order>
</orders>
@XmlRootElement
public class Order {
    private LocalDateTime created;
    private List<Product> products;


    public LocalDateTime getCreated() {
        return created;
    }

    @XmlElement
    public void setCreated(LocalDateTime created) {
        this.created = created;
    }

    public List<Product> getProducts() {
        return products;
    }

    @XmlElementWrapper(name="product")
    @XmlElement
    public void setProducts(List<Product> products) {
        this.products = products;
    }
}

共 (1) 个答案

  1. # 1 楼答案

    你的代码有几个问题。 (为了不破坏您的学习体验,我只给出一些说明,但没有完整的代码。)

    • 表示XML根元素<orders>...</orders> 您需要另一个类(我们称之为^{)。
      • @XmlRootElement注释它
      • <orders>元素包含几个<order>元素。 因此,您需要添加一个成员List<Order> orders。 用@XmlElement(name="order")注释它
    • 在你的Order课上:
      • 这里不需要@XmlRootElement注释, 因为<order>不是根元素
      • 仅用@XmlElement(name="product")注释products (如@PiotrP.Karwasz在评论中所述)
      • @XmlAttribute而不是@XmlElement注释created成员。 这是因为您有一个XML属性created="something", 不是XML元素<created>something</created>
      • JAXB可能会抱怨它不支持LocalDateTime。 因此,您可能需要将其更改为Date