JAXB - как в неМаршалл этот XML?

Существует некоторый довольно противный XML, что я хотел бы в неМаршалл к объекту Java использование JaxB. Большая часть из него казалась довольно простой до сих пор - но я отчасти застреваю на этом:

            <assets>
                <asset type="fixed">74,414</asset>
                <asset type="current">1,022,069</asset>
                <asset type="other">0</asset>
                <total type="assets">1,096,483</total>
            </assets>

Это - соответствующая часть даты

<!ELEMENT assets (asset|total)*> <!ELEMENT asset (#PCDATA)> <!ATTLIST asset type CDATA #REQUIRED> <!ELEMENT total (#PCDATA)> <!ATTLIST total type CDATA #REQUIRED>

Какие-либо идеи? Или я должен бросить пытаться использовать JAXB для этого?

Спасибо

5
задан Andrew B 8 July 2010 в 17:04
поделиться

2 ответа

Глядя на XML и DTD, я создал XSD структуры:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified">
  <xs:element name="assets">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="asset"/>
        <xs:element maxOccurs="unbounded" ref="total"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="asset">
    <xs:complexType mixed="true">
      <xs:attribute name="type" use="required" type="xs:string"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="total">
    <xs:complexType mixed="true">
      <xs:attribute name="type" use="required" type="xs:string"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

Используйте xjc для создания классов Java, аннотированных аннотациями привязки JAXB из XSD. Затем используйте демаршаллер, чтобы демаршалировать его в объект Java.

Редактировать

Сгенерированные классы Java:

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "asset",
    "total"
})
@XmlRootElement(name = "assets")
public class Assets {

    @XmlElement(required = true)
    protected List<Asset> asset;
    @XmlElement(required = true)
    protected List<Total> total;

    public List<Asset> getAsset() {
        if (asset == null) {
            asset = new ArrayList<Asset>();
        }
        return this.asset;
    }

    public List<Total> getTotal() {
        if (total == null) {
            total = new ArrayList<Total>();
        }
        return this.total;
    }

}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "content"
})
@XmlRootElement(name = "asset")
public class Asset {

    @XmlValue
    protected String content;
    @XmlAttribute(required = true)
    protected String type;

    public String getContent() {
        return content;
    }

    public void setContent(String value) {
        this.content = value;
    }

    public String getType() {
        return type;
    }

    public void setType(String value) {
        this.type = value;
    }

}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "content"
})
@XmlRootElement(name = "total")
public class Total {

    @XmlValue
    protected String content;
    @XmlAttribute(required = true)
    protected String type;

    public String getContent() {
        return content;
    }

    public void setContent(String value) {
        this.content = value;
    }

    public String getType() {
        return type;
    }

    public void setType(String value) {
        this.type = value;
    }

}
5
ответ дан 14 December 2019 в 13:25
поделиться

Есть ли у вас класс, на который вы снимаете маршалинг? Похоже, что для этого потребуется следующее:

/** AssetContainer */
@XmlRootElement(namespace = "project/schema")
@XmlAccessorType(XmlAccessType.FIELD)
public class AssetContainer implements Unmarshallable {
    private List<Asset> assetList;
    private int totalAssets;
}

/** Asset */
@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class Asset implements Unmarshallable {
    private AssetTypeEnum type;
    private int count;
}

/** Unmarshallable */
public interface Unmarshallable {
    // Marker interface
}

А затем используйте XmlTypeAdapter для сопоставления элементов XML с нужным классом.

1
ответ дан 14 December 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: