繁体   English   中英

XML 解析为 Java 对象

[英]Xml parsing to Java object

我有这样的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 绑定,而是使用具有相似(但不相同的注释)的类似框架。 我只能回答 JAXB,但很可能它与您的框架存在相同的问题:

似乎,模型的嵌套并没有反映 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 合并为一个类的最简单方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM