C# 序列化中的 CDATA块

来源:互联网 发布:dbc数据库是什么 编辑:程序博客网 时间:2024/05/22 12:49

问题描述:

首先我有一个Xml文件,文件中的一些节点内容是包含在CDATA块中的,在某些情况下我需要从这个Xml文件中序列化出这个对象,有时我又需要通过反序列化修改这个Xml文件中CDATA块的内容。

Xml的部分内容如下:

1 <?xml version="1.0" encoding="utf-8"?>
2 <xml>
3   <configure>
4     <basenode>items</basenode>
5     <node>item</node>
6     <field>name,value</field>
7   </configure>
8   <items>
9     <item>
10       <name><![CDATA[admin-table]]></name>
11       <value><![CDATA[table_admin]]></value>
12     </item>
13     <item>
14       <name><![CDATA[admin-pre]]></name>
15       <value><![CDATA[a_]]></value>
16     </item>
17   </items>
18 </xml>
复制代码
1 <?xml version="1.0" encoding="utf-8"?>
2 <xml>
3   <configure>
4     <basenode>items</basenode>
5     <node>item</node>
6     <field>name,value</field>
7   </configure>
8   <items>
9     <item>
10       <name><![CDATA[admin-table]]></name>
11       <value><![CDATA[table_admin]]></value>
12     </item>
13     <item>
14       <name><![CDATA[admin-pre]]></name>
15       <value><![CDATA[a_]]></value>
16     </item>
17   </items>
18 </xml>
复制代码

这个配置文件的对象类:

复制代码
  1 namespace ScnCommon
  2 {
  3   [XmlRootAttribute("xml")]
  4   public class ScnConfig
  5   {
  6     public ScnElement configure;
  7     [XmlArrayAttribute("items")]
  8     public item[] items;
  9     [XmlIgnore]
10     public staticstring ScnLinkTag= "<!--scnlinktag-->";
11
12     private staticstring GetFilePath(string argFileName)
13     {
14       string path = HttpContext.Current.Request.PhysicalApplicationPath+ "common\\"+argFileName;
15       return path;
16     }
17
18     public static ScnConfig GetConfig(string argFileName)
19     {
20       string key ="scn-"+ argFileName;
21       ScnConfig config= (ScnConfig)HttpContext.Current.Cache[key];
22       if (config ==null)
23       {
24         XmlSerializer seria= new XmlSerializer(typeof(ScnConfig));
25         try
26         {
27          string file = GetFilePath(argFileName);
28           FileStream fs= new FileStream(file, FileMode.Open);
29           config= (ScnConfig)seria.Deserialize(fs);
30           fs.Close();
31           HttpContext.Current.Cache.Insert(key, config,new CacheDependency(file));
32         }
33         catch (System.IO.FileNotFoundException)
34         {
35           config= new ScnConfig();
36         }
37       }
38       return config;
39     }
40
41     public staticvoid SaveConfig(ScnConfig config,string argFileName)
42     {
43       string file = GetFilePath(argFileName);
44       XmlSerializer seria= new XmlSerializer(typeof(ScnConfig));
45       FileStream fs= new FileStream(file, FileMode.Create);
46       seria.Serialize(fs, config);
47       fs.Close();
48     }
49
50     public staticstring GetValue(string argName,string argFileName)
51     {
52       string value = "";
53       ScnConfig config= GetConfig(argFileName);
54       if (config.items != null)
55       {
56         for (int i= 0; i< config.items.Length; i++)
57         {
58          if (config.items[i].name.Value== argName)
59           {
60             value= config.items[i].value.Value;
61           }
62         }
63       }
64       return value;
65     }
66   }
67
68   public class ScnElement
69   {
70     public string basenode;
71     public string node;
72     public string field;
73   }
74
75   public class item
76   {
77     private XmlCDataSection _name;
78     public XmlCDataSection name
79     {
80       get {
81         return this._name;
82       }
83       set {
84         XmlDataDocument doc= new XmlDataDocument();
85         XmlCDataSection cd= doc.CreateCDataSection(value.Value);
86         this._name = cd;
87       }
88     }
89
90     private XmlCDataSection _value;
91     public XmlCDataSection value
92     {
93       get {
94         return this._value;
95       }
96       set {
97         XmlDataDocument doc= new XmlDataDocument();
98         XmlCDataSection cd= doc.CreateCDataSection(value.Value);
99         this._value = cd;
100       }
101     }
102   }
103 }
复制代码

相关说明:

1.定义Config类,一些节点。ScnElement、item 类节点的相关描述,这里需要注意的是item 类中所使用的 XmlDataDocument 、XmlCDataSection。这个就是保证在反序列化时相关内容能写入CDATA块中的关键。
2.GetFilePath 获取Xml文件的路径。GetConfig 通过Xml序列化出这个Config对象。SaveConfig 对Config对象的某些属性修改后反序列化成新的Xml文件。GetValue 通过名称获取相关值的方法。

原创粉丝点击