java - Xml解析为Java对象

标签 java xml parsing

我有这样的 xml 内容:

 <EVENTSTREAM id="2016050408105300002" name="LATESTWINNERS" rc="0">
    <ROUND id="2016050309342400001" nyxid="2016050309342400003">
    <TIMESTAMP>2016-05-03T09:34:24.000</TIMESTAMP>
    <PLAYERINFO accountid="112307829" firstname="Simon" lastname="Schork" nickname="SimonSchork" zip="76133" operatorid="275" currency="EUR" language="" country="DE" city="SimonSchork" sex="M" universe="Default"/>
    <CHANNEL>I</CHANNEL>
    <BALANCE>110.34</BALANCE>
    <WONAMOUNT>3.00</WONAMOUNT>
    <BONUSWONAMOUNT>0.00</BONUSWONAMOUNT>
    <SUBSYSTEMID>3</SUBSYSTEMID>
    <CAT1>1</CAT1>
    <CAT2>1</CAT2>
    <CAT3>30136</CAT3>
    <OUTCOME>W</OUTCOME>
    <CLIENT>flash</CLIENT>
    <BETAMOUNT>1.00</BETAMOUNT>
    <BONUSBETAMOUNT>0.00</BONUSBETAMOUNT>
    <BASECURRENCY>EUR</BASECURRENCY>
    </ROUND>

我创建了这样的模型,LastWinnersModel

@Root(name = "EVENTSTREAM", strict = false)
public class LastWinnersModel {

    @Attribute(name = "name", required = false)
    private String name;

    @Attribute(name = "rc")
    private int rc;

    @Attribute(name = "id")
    private long id;

    @ElementList(name = "ROUND", entry = "ROUND", inline = true, required = false)
    private List<RoundModel> lastWinners = new ArrayList<>();

圆形模型

@Root(name = "ROUND", strict = false)
public class RoundModel {

    @Attribute(name = "id")
    private long id;

    @Attribute(name = "nyxid")
    private long nyxId;

    @Element(required = false)
    private LastWinnerModel lastWinnerModel;

和 LastWinnerModel

public class LastWinnerModel {

    @Attribute(name = "TIMESTAMP")
    private String date;

    @Attribute(name = "CHANNEL")
    private String channel;

    @Attribute(name = "BALANCE")
    private BigDecimal balance;

    @Attribute(name = "WONAMOUNT")
    private BigDecimal wonAmonut;

    @Attribute(name = "BONUSWONAMOUNT")
    private BigDecimal bonusWonAmount;

    @Attribute(name = "SUBSYTEMID")
    private int subsystemId;

    @Attribute(name = "CAT1")
    private int cat1;

    @Attribute(name = "CAT2")
    private int cat2;

    @Attribute(name = "CAT3")
    private int cat3;

    @Attribute(name = "OUTCOME")
    private String outcome;

    @Attribute(name = "CLIENT")
    private String client;

    @Attribute(name = "BETAMOUNT")
    private BigDecimal betAmount;

    @Attribute(name = "BONUSBETAMOUNT")
    private BigDecimal bonusBetAmount;

    @Attribute(name = "BASECURRENCY")
    private String baseCurrency;

    @Attribute(name = "PLAYERINFO")
    private PlayerInfoModel playerInfo;

在休息

@Element(required = false)
        private LastWinnerModel lastWinnerModel;
尽管我从外部服务收到一些数据,但

始终为空。我想问题是 LastWinnerModel 没有 root 或者我的模型可能有问题?感谢您的回复。

最佳答案

似乎您没有使用 JAXB 进行 XML 绑定(bind),而是使用具有类似(但不相同的注释)的类似框架。我只能回答 JAXB,但很可能与您的框架存在相同的问题:

看来,模型的嵌套并未反射(reflect) XML 中的嵌套。 在 XML 中,TIMESTAMP 标签是 ROUND 标签的直接子代,即正确缩进的 XML 如下所示:

<EVENTSTREAM...
    <ROUND...
        <TIMESTAMP...

因此 JAXB 会尝试将 TIMESTAMP 标记映射到 RoundModel 类中的变量。然而,这样的变量并不存在,因此 TIMESTAMP 的 XML 值根本不会映射到您的模型中并会丢失(CHANEL、BALANCE 也是如此)。

您定义的模型将映射到以下结构的 XML:

<EVENTSTREAM ...
    <ROUND...
        <lastWinnerModel...
            <TIMESTAMP...

但是,如果您无法更改 XML,那么在 JAXB 中,我不知道通过添加另一个神奇注释来映射模型的真正简单方法。 (例如,您可以在 JAXB 中为此使用 XmlAdapter 类。)因此,如果您陷入 XML 困境,那么将 RoundModel 和 LastWinnerModel 合并到一个类中是最简单的方法。

关于java - Xml解析为Java对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37026853/

相关文章:

c# - 如何通过C#中调用存储过程将URL中的xml数据插入SQL Server 2008数据库

java - Axis 生成的 wsdl 不包含所有类型定义

java - 逐行比较结果集中的行,消除等于并显示行间差异降序的差异

c# - C# 中的编程式 XML 差异/合并

wpf - 手动将字符串解析为 XAML 属性

android - assets文件夹和res/xml的区别

c - 最大限度地减少 sscanf 的内存消耗

java - 带有serialVersionUID的数组类?

java - 如何使用 Swagger 在 @ApiResponse 中添加示例?

xml - 如何将数据库查询的行转换为 XML 文件?