2010-07-08 6 views
5

Theres какой-то довольно неприятный XML, который я хотел бы отменить для java-объекта с помощью JaxB. Большинство из них показалось довольно просто до сих пор - но я вроде застряли на этом:JAXB - как развязать этот XML?

  <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 для этого?

Благодаря

+0

Я не вижу здесь, как DTD здесь ... какую структуру объектов вы хотите отобразить? – skaffman

+0

У меня еще нет класса, в котором я разбираюсь, XML ранее обрабатывался обработчиком SAX. Я думаю, я хотел попробовать и сгладить структуру - поскольку все, что мне нужно сделать, это отобразить ее в таблице html/PDF; его потенциальный ежедневный материал, а theres хуже! Это всего лишь небольшая часть xml. Из ответов здесь кажется, что мне придется использовать Коллекции; Я новичок в JAXB и мире XML, но, надеюсь, ответы здесь должны дать мне несколько идей, если я продолжу этот путь. –

ответ

5

Глядя на 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. Затем используйте unmarshaller, чтобы развязать его к объекту 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; 
    } 

} 
1

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

/** 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-элементов в надлежащий класс.