xml序列化/反序列化

xml

依賴開源庫XStream ,需要用到java註解

Talk is cheap,直接看代碼

測試用xml數據結構

<?xml version="1.0" encoding="UTF-8"?>
<feed>
    <title>測試</title>
    <entry>
        <id>52231366</id>
        <published>2017-06-27T16:16:18.000Z</published>
        <title type="text">深夜劇場:彝海結盟 18</title>
        <content type="text">
1935年5月遵義會議後,在毛澤東的指揮下,中央紅軍四渡赤水、兩佔遵義、佯攻貴陽、進逼昆明,甩開了川滇黔湘桂的國民黨30萬大軍的圍追堵截。
        </content>
        <media:group>
            <itv:cid>52231366</itv:cid>
            <itv:code>02000006000000072017062680000002</itv:code>
            <itv:attribute name="start">20170627011600</itv:attribute>
            <itv:attribute name="runtime">00:14:00</itv:attribute>
        </media:group>
        <itv:itv/>
    </entry>
    <entry>
        <id>52231367</id>
        <published>2017-06-27T16:16:18.000Z</published>
        <title type="text">深夜劇場:彝海結盟</title>
        <content type="text">
1935年5月遵義會議後,在毛澤東的指揮下,中央紅軍四渡赤水、兩佔遵義、佯攻貴陽、進逼昆明,甩開了川滇黔湘桂的國民黨30萬大軍的圍追堵截。
        </content>
        <media:group>
            <itv:cid>52231367</itv:cid>
            <itv:attribute name="start">20170627013000</itv:attribute>
            <itv:attribute name="runtime">03:24:00</itv:attribute>
        </media:group>
        <itv:itv/>
    </entry>
</feed>

根據數據結構定義javabean

Feed.java

@XStreamAlias("feed")
public class Feed {
    @XStreamImplicit
    public List<Entry> entries;
}

@XStreamImplicit的作用,如果不加此註解則匹配數據結構如下:

<feed>
  <entrys>
      <entry/>
      <entry/>
  </entrys>
</feed>

Entry.java

@XStreamAlias("entry")
public class Entry {
    public String id;
    public String published;
    public String title;
    public String content;

    @XStreamAlias("media:group")
    public MediaGroup mediaGroup;
}

MedieGroup.java

@XStreamAlias("media:group")
public class MediaGroup {
    @XStreamAlias("itv:cid")
    public String itvCid;

    @XStreamImplicit
    public List<ItvAttribute> itvAttributes;

    @XStreamAlias("itv:attribute")
    @XStreamConverter(ItvAttriConverter.class) // 在註解中指定轉換器
    public static class ItvAttribute{
        @XStreamAsAttribute
        public String name;

        public String text;
    }
}

@XStreamAsAttribute表示成員變量是屬性元素,如下“name”

<feed>
  <entry>
      <media:group>
          <itv:attribute name="n">v</itv:attribute>
          <itv:attribute name="n">v</itv:attribute>
      </media:group>
  </entry>
</feed>

ItvAttriConverter .java

public class ItvAttriConverter implements Converter {
    // 序列化時執行
    @Override
    public void marshal(Object o, HierarchicalStreamWriter hierarchicalStreamWriter, MarshallingContext marshallingContext) {
        MediaGroup.ItvAttribute itvAttribute = (MediaGroup.ItvAttribute) o;
        if (itvAttribute.name != null) {
            hierarchicalStreamWriter.addAttribute("name", itvAttribute.name);
        }
        if (itvAttribute.text != null) {
            hierarchicalStreamWriter.setValue(itvAttribute.text);
        }
    }

    // 反序列化時執行
    @Override
    public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader, UnmarshallingContext unmarshallingContext) {
        MediaGroup.ItvAttribute itvAttribute = new MediaGroup.ItvAttribute();
        itvAttribute.name = hierarchicalStreamReader.getAttribute("name"); //得到屬性的值
        itvAttribute.text = hierarchicalStreamReader.getValue(); //得到<itv:attribute/>節點的值
        return itvAttribute;
    }

    @Override
    public boolean canConvert(Class aClass) {
        return aClass.equals(MediaGroup.ItvAttribute.class);
    }

}

封裝:

public class XmlParser {
    private XStream xStream;

    public XmlParser(){
        xStream = new XStream(new Xpp3Driver());
        xStream.ignoreUnknownElements(); // 忽略javabean中沒有定義但在xml中存在的元素,不加這句會報錯
        xStream.processAnnotations(Feed.class);
    }


    public Feed parse(String xml) {
        Feed feed = (Feed) xStream.fromXML(xml);
        return feed;
    }

    public String toXml(Object obj) {
        return xStream.toXML(obj);
    }

}

Test:

public static void main(String[] args){
    // 序列化
    Feed feed = new Feed();
    List<Entry> entries = new ArrayList<Entry>();
    Entry entry = new Entry();
    entry.mediaGroup = new MediaGroup();
    entry.mediaGroup.itvAttributes = new ArrayList<MediaGroup.ItvAttribute>();
    entry.mediaGroup.itvAttributes.add(new MediaGroup.ItvAttribute());
    entries.add(entry);
    feed.entries = entries;
    String xx = new XmlParser().toXml(feed);

    System.out.println(xx);

    // 反序列化
    Feed fd = new XmlParser().parse(xx);
}

PS:但我們需要對某個xml數據進行反序列化時,調試時可以優先測試序列化得到的xml是否給出的xml數據結構一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章