C# 序列化中的 CDATA块

问题描述:

首先我有一个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   static   string  ScnLinkTag  =   " <!--scnlinktag--> " ;
 11 
 12       private   static   string  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   static   void  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   static   string  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 通过名称获取相关值的方法。

转载于:https://www.cnblogs.com/suntop/archive/2010/09/16/1828084.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值