xstream,节点属性起别名时这样的问题你遇到过吗
首先這是我自己定義的一個(gè)xstream,這個(gè)xstream是為了在處理xml時(shí)能夠加上<![CDATA[------]]>而特別重寫(xiě)的。這個(gè)xstream是沒(méi)有任何問(wèn)題的。
private static XStream xstream = new XStream(new XppDriver() {public HierarchicalStreamWriter createWriter(Writer out) {return new PrettyPrintWriter(out) {boolean cdata = true;@SuppressWarnings("rawtypes")public void startNode(String name, Class clazz) {super.startNode(name, clazz);}protected void writeText(QuickWriter writer, String text) {if (cdata) {writer.write("<![CDATA[");writer.write(text);writer.write("]]>");} else {writer.write(text);}}};}});
然后是我們要轉(zhuǎn)換為xml文件的類,這里我實(shí)現(xiàn)了一個(gè)basemessage,用來(lái)包含所有消息都包含著的通用屬性字段。然后實(shí)現(xiàn)了一個(gè)textmessage來(lái)專門(mén)處理文本消息,textmessage是集成了basemessage的。代碼如下;
public class BaseMessage {private String ToUserName;private String FromUserName;private long CreateTime;private String MsgType;public String getToUserName() {return ToUserName;}public void setToUserName(String toUserName) {ToUserName = toUserName;}public String getFromUserName() {return FromUserName;}public void setFromUserName(String fromUserName) {FromUserName = fromUserName;}public long getCreateTime() {return CreateTime;}public void setCreateTime(long createTime) {CreateTime = createTime;}public String getMsgType() {return MsgType;}public void setMsgType(String msgType) {MsgType = msgType;}}
public class TextMessage extends BaseMessage {private String Content;public String getContent() {return Content;}public void setContent(String content) {this.Content = content;}}
然后用xstream做如下的測(cè)試: public static void main(String[] args) throws Exception {TextMessage message = new TextMessage();message.setFromUserName("1");message.setToUserName("2");message.setCreateTime(System.currentTimeMillis());message.setMsgType("art");message.setContent("133");xstream.alias("xml", message.getClass());// 這里指定TextMessage中的ToUserName變?yōu)閷傩詘stream.useAttributeFor(TextMessage.class, "ToUserName");// 指定TextMessage中的Content變?yōu)閷傩?#xff0c;別名為c_cxstream.aliasAttribute(TextMessage.class, "Content", "c_c");// 指定TextMessage中的MsgType變?yōu)閷傩?#xff0c;別名為mtypexstream.aliasAttribute(TextMessage.class, "MsgType", "mtype");// 指定BaseMessage中的FromUserName變?yōu)閷傩?#xff0c;別名為ffxstream.aliasAttribute(BaseMessage.class, "FromUserName", "ff");String result = xstream.toXML(message);System.out.println(result);// StringReader readers = new StringReader(result);// InputSource inputSource = new InputSource(readers);// SAXReader reader = new SAXReader();// Document document = null;// document = reader.read(inputSource);// Map<String, String> map = new HashMap<String, String>();// Element root = document.getRootElement();// System.out.println(root.attributeValue("ff"));// List<Element> elements = root.elements();// for (Element e : elements) {// System.out.println(e.getName() + "------" + e.getText() + "---");// }}
運(yùn)行程序后得到結(jié)果如下:
<xml ToUserName="2" ff="1" MsgType="art" c__c="133"><CreateTime><![CDATA[1447310176809]]></CreateTime> </xml>
分析結(jié)果,我們可以看到如下的現(xiàn)象:1.指定TextMessage中的ToUserName變?yōu)閷傩允浅晒Φ摹?.指定TextMessage中的Content變?yōu)閷傩?#xff0c;別名為c_c是成功的,而// 指定TextMessage中的MsgType變?yōu)閷傩?#xff0c;別名為mtype則只做到了將MsgType變成了屬性,卻沒(méi)有起別名。3.指定BaseMessage中的FromUserName變?yōu)閷傩?#xff0c;別名為ff是成功的。
通過(guò)上邊這些現(xiàn)象,我是不是可以這樣理解?一個(gè)類從另一個(gè)類中集成了某些屬性的時(shí)候,通過(guò)這個(gè)類來(lái)為繼承的屬性器別名是不行的,而通過(guò)基類為這個(gè)繼承的屬性來(lái)起別名就可以。然而如果不起別名,那么可以通過(guò)useAttributeFor來(lái)將繼承的字段指定為xml文件的屬性呢?實(shí)際測(cè)試是這樣的。
總結(jié)
以上是生活随笔為你收集整理的xstream,节点属性起别名时这样的问题你遇到过吗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在2020年学习cocos游戏引擎
- 下一篇: Kaggle-泰坦尼克号