最近工作中遇到一個問題,要求創建一個xml文件,在創建的時候要初始化該XML文檔,同時該文檔打開后是XML形式,但是后綴名不是。在網上找了好些資料沒找到,只能自己試著弄了一下,沒想到成功了,把它記下來作為自己的學習筆記。
需求:創建XML文件,后綴名為.xwsp
初始化的文檔節點如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <xxxversion="1.0" name="aaa"> 3 <CreationInfo> 4 <CreatedBy>CreateUser</CreatedBy> 5 <CreatedTime>2015/10/1 14:03:48</CreatedTime> 6 <SavedTime>2015/10/1 14:03:48</SavedTime> 7 </CreationInfo> 8 <a/> 9 <b/>10 <c/>11 </xxx>
首先第一個問題:后綴名為.xwsp,打開后顯示的XML文本
當時這個問題想復雜了,因為要進行二進制轉換之類的,網上找了老半天沒找到,最后自己試了一下,簡單的要死,只能說自己笨
解決方法:xmlDoc.Save("a.xwsp");
只要保存xml文件的時候改了后綴名即可,我也是醉了
第二個問題:添加節點的時候尤其是添加<CreatedBy><CreatedTime><SavedTime>這三個節點的時候老是添加不進去
當時寫的代碼如下:
1 PRivate static void CreateXwspFile(string fileName, string path) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 //創建類型聲明節點 5 XmlDeclaration xdDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); 6 xmlDoc.AppendChild(xdDec); 7 8 //創建根節點 9 XmlElement xeRoot = xmlDoc.CreateElement("xxx");10 //給節點屬性賦值11 xeRoot.SetAttribute("version", "1.0");12 xeRoot.SetAttribute("name", fileName);13 xmlDoc.AppendChild(xeRoot);14 15 //創建并添加<CreationInfo></CreationInfo>節點16 xeRoot = xmlDoc.CreateElement("CreationInfo");17 XmlNode xnXwsp = xmlDoc.SelectSingleNode("xxx");18 if (xnXwsp != null)19 {20 xnXwsp.AppendChild(xeRoot);21 }22 23 //創建并添加<CreatedBy></CreatedBy>節點24 xeRoot = xmlDoc.CreateElement("CreatedBy");25 xnXwsp = xmlDoc.SelectSingleNode("CreationInfo");26 if (xnXwsp != null)27 {28 xnXwsp.AppendChild(xeRoot);29 }30 31 //創建并添加<CreatedTime></CreatedTime>節點32 xeRoot = xmlDoc.CreateElement("CreatedTime");33 xnXwsp = xmlDoc.SelectSingleNode("CreationInfo");34 if (xnXwsp != null)35 {36 xnXwsp.AppendChild(xeRoot);37 }38 39 //創建并添加<SavedTime></SavedTime>節點40 xeRoot = xmlDoc.CreateElement("SavedTime");41 xnXwsp = xmlDoc.SelectSingleNode("CreationInfo");42 if (xnXwsp != null)43 {44 xnXwsp.AppendChild(xeRoot);45 }46 47 //創建并添加<a></a>節點48 xeRoot = xmlDoc.CreateElement("a");49 xnXwsp = xmlDoc.SelectSingleNode("xxx");50 if (xnXwsp != null)51 {52 xnXwsp.AppendChild(xeRoot);53 }54 //創建并添加<b></b>節點55 xeRoot = xmlDoc.CreateElement("b");56 xnXwsp = xmlDoc.SelectSingleNode("xxx");57 if (xnXwsp != null)58 {59 xnXwsp.AppendChild(xeRoot);60 }61 //創建并添加<c></c>節點62 xeRoot = xmlDoc.CreateElement("c");63 xnXwsp = xmlDoc.SelectSingleNode("xxx");64 if (xnXwsp != null)65 {66 xnXwsp.AppendChild(xeRoot);67 }68 //保存XML文檔69 try70 {71 xmlDoc.Save(path + fileName + ".xwsp");72 }73 catch (Exception ep)74 {75 Console.WriteLine(ep.Message);76 }77 }
結果如下:
1 <?xml version="1.0" encoding="utf-8"?>2 <xxx version="1.0" name="workspace1">3 <CreationInfo />4 <a />5 <b />6 <c />7 </xxx>
子節點<CreatedBy><CreatedTime><SavedTime>死活出不來,打斷點<CreationInfo>節點先添加進去了,但是xnXwsp = xmlDoc.SelectSingleNode("CreationInfo");這一句的結果死活為null,想不通,現在都沒想通,后來換了一種寫法就OK了
這種得不到正確寫法的思路是:先添加父節點<CreationInfo>再添加子節點<CreatedBy><CreatedTime><SavedTime>
網上找到另一種寫法,思路是:先創建子節點<CreatedBy><CreatedTime><SavedTime>,再創建父節點<CreationInfo>,然后把子節點添加到該父節點下面,再查找根節點<xxx>,最后把父節點<CreationInfo>添加到根節點末尾就OK了,代碼如下:
1 private static void CreateXwspFile(string fileName, string path) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 //創建類型聲明節點 5 XmlDeclaration xdDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); 6 xmlDoc.AppendChild(xdDec); 7 8 //創建根節點 9 XmlElement xeRoot = xmlDoc.CreateElement("xxx");10 //給節點屬性賦值11 xeRoot.SetAttribute("version", "1.0");12 xeRoot.SetAttribute("name", fileName);13 xmlDoc.AppendChild(xeRoot);14 15 ////創建并添加<CreationInfo></CreationInfo>節點16 ////創建并添加<CreatedBy></CreatedBy>節點17 ////創建并添加<CreatedTime></CreatedTime>節點18 ////創建并添加<SavedTime></SavedTime>節點19 XmlElement xeCreationInfo = xmlDoc.CreateElement("CreationInfo");20 XmlElement xeCreatedBy = xmlDoc.CreateElement("CreatedBy");21 xeCreatedBy.InnerText = "Tektronix Course Editor";22 XmlElement xeCreatedTime = xmlDoc.CreateElement("CreatedTime");23 xeCreatedTime.InnerText = DateTime.Now.ToString();24 XmlElement xeSavedTime = xmlDoc.CreateElement("SavedTime");25 xeSavedTime.InnerText = DateTime.Now.ToString();26 xeCreationInfo.AppendChild(xeCreatedBy);27 xeCreationInfo.AppendChild(xeCreatedTime);28 xeCreationInfo.AppendChild(xeSavedTime);29 XmlNode xnXwsp = xmlDoc.SelectSingleNode("xxx");30 if (xnXwsp != null)31 {32 xnXwsp.AppendChild(xeCreationInfo);33 }34 35 //創建并添加<a></a>節點36 xeRoot = xmlDoc.CreateElement("a");37 if (xnXwsp != null)38 {39 xnXwsp.AppendChild(xeRoot);40 }41 //創建并添加<b></b>節點42 xeRoot = xmlDoc.CreateElement("b");43 if (xnXwsp != null)44 {45 xnXwsp.AppendChild(xeRoot);46 }47 //創建并添加<c></c>節點48 xeRoot = xmlDoc.CreateElement("c");49 if (xnXwsp != null)50 {51 xnXwsp.AppendChild(xeRoot);52 }53 //保存XML文檔54 try55 {56 xmlDoc.Save(path + fileName + ".xwsp");57 }58 catch (Exception ep)59 {60 Console.WriteLine(ep.Message);61 }62 }
結果如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <xxx version="1.0" name="workspace1"> 3 <CreationInfo> 4 <CreatedBy>Tektronix Course Editor</CreatedBy> 5 <CreatedTime>2015/10/1 14:43:56</CreatedTime> 6 <SavedTime>2015/10/1 14:43:57</SavedTime> 7 </CreationInfo> 8 <a /> 9 <b />10 <c />11 </xxx>
現在還有一個問題沒有解決:
要在<?xml version="1.0" encoding="utf-8"?>節點的后面插入<!DOCTYPE xwsp>這個節點,不曉得該怎么做,而且后面那個xwsp是可以改變的,意思就是可以自己定義,比如說我可以把它改為aaa之類的,這個暫時還沒找到解決方法
新聞熱點
疑難解答