Java:Jax读写xml,类混淆

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

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

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

<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>

索尼54.6英寸(Diag)Xbr Hx929互联网电视
00027242816657
2999.99
索尼
配备16GB Wi-Fi的苹果iPad 2-iOS 5-黑色
00885909464517
399
苹果
索尼NWZ-E464 8GB E系列随身听视频MP3播放器蓝色
00027242831438
91.99
索尼
Apple MacBook Air一款11.6英寸Mac OS X v10.7版Lion MacBook
00885909464043
1149
苹果
松下TC-L47E50 47英寸智能电视Viera E50系列LED高清电视
00885170076471
999.99
松下
@XmlRootElement
公共阶级秩序{
创建私有LocalDateTime;
私人上市产品;
public LocalDateTime getCreated(){
创建回报;
}
@XmlElement
已创建公共void集(已创建LocalDateTime){
this.created=created;
}
公共列表产品(){
退货产品;
}
@XmlElementWrapper(name=“产品”)
@XmlElement
公共产品(列出产品){
这一点。产品=产品;
}
}

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

  • 表示XML根元素
    您需要另一个类(我们称之为
    Orders
    )。
    • @XmlRootElement
      注释它
    • 元素包含多个
      元素。 因此,您需要添加一个成员
      列出订单
      。 用
      @xmlement(name=“order”)
      注释它
  • 在您的
    课程中:
    
    • 这里不需要
      @XmlRootElement
      注释, 因为
      不是根元素
    • 仅使用
      @xmlement(name=“product”)
      (如@PiotrP.Karwasz在评论中所述)
    • @xmldattribute
      而不是
      @xmlement
      注释创建的
      成员。
      这是因为您有一个XML属性
      created=“something”
      , 不是一个XML元素
      什么东西
    • JAXB可能会抱怨它不支持
      LocalDateTime
      。 因此,您可能需要将其更改为
      Date

您不需要
@xmlementwrapper
注释,但需要为
@xmlement
注释提供一个
名称
参数。检查它是如何工作的。@PiotrP.Karwasz谢谢,没有包装器,但是我如何编写包含这些产品的类?您能用一些代码示例向我解释一下吗e在一个单独的答案中?我会给你一个代表。网络上有很多关于JAXB的好教程。请检查,例如…有与你类似的例子。它们提供了更好的答案。@PiotrP.Karwasz谢谢!非常感谢!
@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;
    }
}