xstream,节点属性起别名时这样的问题你遇到过吗
生活随笔
收集整理的這篇文章主要介紹了
xstream,节点属性起别名时这样的问题你遇到过吗
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先這是我自己定義的一個xstream,這個xstream是為了在處理xml時能夠加上<![CDATA[------]]>而特別重寫的。這個xstream是沒有任何問題的。
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);}}};}});
然后是我們要轉換為xml文件的類,這里我實現了一個basemessage,用來包含所有消息都包含著的通用屬性字段。然后實現了一個textmessage來專門處理文本消息,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做如下的測試: 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變為屬性xstream.useAttributeFor(TextMessage.class, "ToUserName");// 指定TextMessage中的Content變為屬性,別名為c_cxstream.aliasAttribute(TextMessage.class, "Content", "c_c");// 指定TextMessage中的MsgType變為屬性,別名為mtypexstream.aliasAttribute(TextMessage.class, "MsgType", "mtype");// 指定BaseMessage中的FromUserName變為屬性,別名為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() + "---");// }}
運行程序后得到結果如下:
<xml ToUserName="2" ff="1" MsgType="art" c__c="133"><CreateTime><![CDATA[1447310176809]]></CreateTime> </xml>
分析結果,我們可以看到如下的現象:1.指定TextMessage中的ToUserName變為屬性是成功的。2.指定TextMessage中的Content變為屬性,別名為c_c是成功的,而// 指定TextMessage中的MsgType變為屬性,別名為mtype則只做到了將MsgType變成了屬性,卻沒有起別名。3.指定BaseMessage中的FromUserName變為屬性,別名為ff是成功的。
通過上邊這些現象,我是不是可以這樣理解?一個類從另一個類中集成了某些屬性的時候,通過這個類來為繼承的屬性器別名是不行的,而通過基類為這個繼承的屬性來起別名就可以。然而如果不起別名,那么可以通過useAttributeFor來將繼承的字段指定為xml文件的屬性呢?實際測試是這樣的。
總結
以上是生活随笔為你收集整理的xstream,节点属性起别名时这样的问题你遇到过吗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在2020年学习cocos游戏引擎
- 下一篇: Kaggle-泰坦尼克号