JaxB:如何从嵌套元素中检索文本属性?

时间:2018-11-09 03:48:05

标签: java xml jaxb

我希望Country类存储“ ISO_3166-1_Alpha-2_Code”代码。该代码当前取回“ ISO_3166-1_Numeric-3_Code”代码。无法弄清楚如何调整Country类以获得我想要的特定属性。

XML:

<?xml version='1.0' encoding='UTF-8'?>
<wd:Message_Event_Configuration">
    <wd:Message_Event_Configuration_Data>
        <wd:Country_Reference wd:Descriptor="Saint Martin">
            <wd:ID wd:type="WID">66b7082a21e510000961bb6d82b5002a</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Alpha-2_Code">MF</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Alpha-3_Code">MAF</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Numeric-3_Code">663</wd:ID>
        </wd:Country_Reference>
        <wd:Country_Reference wd:Descriptor="Saint Barthelemy">
            <wd:ID wd:type="WID">881527f6cec910000ba81e8dccf61127</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Alpha-2_Code">BL</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Alpha-3_Code">BLM</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Numeric-3_Code">652</wd:ID>
        </wd:Country_Reference>
    </wd:Message_Event_Configuration_Data>
</wd:Message_Event_Configuration>

国家/地区列表:

@XmlRootElement(name = "Message_Event_Configuration")
@XmlAccessorType(XmlAccessType.FIELD)
public class Countries {

    @XmlElementWrapper(name = "Message_Event_Configuration_Data")
    @XmlElement(name = "Country_Reference")

    private List<Country> countries = new ArrayList<Country>();

    public List<Country> getCountries() {
        return countries;
    }

    public void setCountries(List<Country> countries) {
        this.countries = countries;
    }

}

国家/地区:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Country_Reference")
public class Country {

    @XmlElement(name = "ID")
    private String isoCode;

    public Country() {
    }

    public Country(String isoCode) {
        this.isoCode = isoCode;
    }

    @XmlAttribute(name = "ISO_3166-1_Alpha-2_Code")
    public String getISOCode() {
        return isoCode;
    }

    public void setISOCode(String isoCode) {
        this.isoCode = isoCode;
    }
}

1 个答案:

答案 0 :(得分:1)

# import Mutation.updateUser from "./generated/prisma.graphql" @isAdmin XML元素包含ISO代码,用 几个<Country_Reference> XML元素中的复杂方式。 因此,将它们建模为Java <wd:ID>属性太简单了。

相反,您需要对Java结构进行建模,使其与XML结构更加相似。

XML元素String的序列可以由属性<wd:ID>建模 需要由@XmlElement(name="ID")注释。

XML属性List<ID> idList可以由属性wd:Descriptor="...."建模 需要由@XmlAttribute(name="Descriptor")注释。

为方便起见,您可以添加一个全参数构造函数和一些获取方法 String descriptor中的WID和ISO代码。

List<ID>

XML元素@XmlAccessorType(XmlAccessType.FIELD) public class Country { @XmlAttribute(name = "Descriptor") private String descriptor; @XmlElement(name = "ID") private List<ID> idList; public Country() { } public Country(String descriptor, String wid, String isoAlpha2Code, String isoAlpha3Code, String isoNumeric3Code) { this.descriptor = descriptor; idList = new ArrayList<>(); idList.add(new ID("WID", wid)); idList.add(new ID("ISO_3166-1_Alpha-2_Code", isoAlpha2Code)); idList.add(new ID("ISO_3166-1_Alpha-3_Code", isoAlpha3Code)); idList.add(new ID("ISO_3166-1_Numeric-3_Code", isoNumeric3Code)); } public String getWid() { return getIdByType("WID"); } public String getIsoAlpha2Code() { return getIdByType("ISO_3166-1_Alpha-2_Code"); } public String getIsoAlpha3Code() { return getIdByType("ISO_3166-1_Alpha-3_Code"); } public String getIsoNumeric3Code() { return getIdByType("ISO_3166-1_Numeric-3_Code"); } private String getIdByType(String idType) { for (ID id : idList) { if (id.getType().equals(idType)) return id.getValue(); } return null; } } 非常复杂。因此,我们需要一个单独的POJO类来对其进行建模。 我们将其称为<wd:ID>类。

ID<wd:ID ..>之间的XML文本由属性</wd:ID>建模 需要由@XmlValue注释。

XML属性String value由属性wd:type="..."建模 需要由@XmlAttribute注释。

为方便上面的类String type使用,添加了一个全参数构造函数。

Country

下面的屏幕截图(来自调试器)显示了Java结构 并确认XML示例的解组工作正常:

enter image description here