【问题标题】:Java:Jax reading and writing xml, classes confusionJava:Jax读写xml,类混淆
【发布时间】:2021-01-17 17:14:59
【问题描述】:

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

任何帮助将不胜感激。 非常感谢

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

【问题讨论】:

  • 你不需要@XmlElementWrapper注解,但是你需要给@XmlElement注解一个name参数。检查this answer 看看它是如何工作的。
  • @PiotrP.Karwasz 谢谢,好的,所以没有包装器,但是我如何编写包含产品的类?你能用一个单独的答案中的一些代码示例向我解释一下吗?我会给你代表。
  • 网上有很多关于JAXB的好教程。检查,例如BaeldungMost of them 有类似你的例子。他们提供了更好的答案。
  • @PiotrP.Karwasz 谢谢!

标签: java xml jaxb


【解决方案1】:

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

  • 表示XML根元素&lt;orders&gt;...&lt;/orders&gt; 你需要另一个类(我们称之为Orders)。
    • @XmlRootElement注释它。
    • &lt;orders&gt; 元素包含多个 &lt;order&gt; 元素。 因此您需要添加一个成员List&lt;Order&gt; orders。 使用 @XmlElement(name="order") 对其进行注释。
  • 在您的Order 课程中:
    • 这里不需要@XmlRootElement注解, 因为&lt;order&gt; 不是根元素。
    • 仅使用 @XmlElement(name="product") 注释 products (正如@PiotrP.Karwasz 在他的评论中所写的那样)。
    • @XmlAttribute 而不是@XmlElement 注释created 成员。 这是因为你有一个 XML 属性created="something", 不是 XML 元素 &lt;created&gt;something&lt;/created&gt;
    • JAXB 可能会抱怨它不支持LocalDateTime。 因此,您可能需要将其更改为 Date

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多