Существует некоторый довольно противный 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 для этого?
Спасибо
Глядя на 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;
}
}
Есть ли у вас класс, на который вы снимаете маршалинг? Похоже, что для этого потребуется следующее:
/** 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 с нужным классом.