首页 > 代码库 > C# XmlReader

C# XmlReader

一个非常全面的XML解析类
  1 using System;  2 using UnityEngine;  3 using System.Xml;  4 using System.Collections;  5   6 using UnityObject = UnityEngine.Object;  7 using SystemObject = System.Object;  8   9 using Fcm; 10  11 using LoadedTexts = 12     System.Collections.Generic.Dictionary< 13         System.String, 14         System.String 15     >; 16  17 public sealed class XmlReader 18 { 19     public Boolean Open(string fileName) 20     { 21         Close(); 22  23         try 24         { 25             _Document = new XmlDocument(); 26             String xml_content = XmlContent(fileName); 27             _Document.LoadXml(xml_content); 28             XmlNodeList list = _Document.GetElementsByTagName("fcm"); 29             if (0 >= list.Count) 30                 return (false); 31             _Root = list[0] as XmlElement; 32         } 33         catch (Exception) 34         { 35             return (false); 36         } 37  38         return (true); 39     } 40  41     public Int32 ConfigCount 42     { 43         get 44         { 45             try 46             { 47                 if (null == _Root) 48                     return (0); 49                 return (Int32.Parse(_Root.Attributes["count"].Value)); 50             } 51             catch (Exception) 52             { 53                 return (0); 54             } 55         } 56     } 57  58     public Boolean SeekConfig() 59     { 60         return (SeekConfig(0)); 61     } 62  63     public Boolean SeekConfig(Int32 config_index) 64     { 65         if (null == _Document || null == _Root) 66             return (false); 67  68         String config_name = String.Format("CFG{0}", config_index); 69         try 70         { 71             _CurrentConfig = _Root[config_name]; 72         } 73         catch (Exception) 74         { 75             return (false); 76         } 77  78         return (true); 79     } 80  81     public Int32 RecordCount 82     { 83         get 84         { 85             try 86             { 87                 if (null == _CurrentConfig) 88                     return (0); 89                 return (Int32.Parse(_CurrentConfig.Attributes["count"].Value)); 90             } 91             catch (Exception) 92             { 93                 return (0); 94             } 95         } 96     } 97  98     public Boolean SeekRecord(Int32 record_index) 99     {100         if (null == _Document || null == _Root || null == _CurrentConfig)101             return (false);102 103         String record_name = String.Format("RECORD{0}", record_index);104         try105         {106             _CurrentRecord = _CurrentConfig[record_name];107         }108         catch (Exception)109         {110             return (false);111         }112 113         return (true);114     }115 116     public Boolean SeekNextRecord()117     {118         if (null == _Document || null == _Root || null == _CurrentConfig)119             return (false);120 121         try122         {123             if (null == _CurrentRecords)124             {125                 XmlNodeList nl = _CurrentConfig.ChildNodes;126                 _CurrentRecords = nl.GetEnumerator();127             }128             if (!_CurrentRecords.MoveNext())129                 return (false);130             _CurrentRecord = (XmlElement)_CurrentRecords.Current;131         }132         catch (Exception)133         {134             return (false);135         }136 137         return (true);138     }139 140     public String RecordString(String field_name)141     {142         return (RecordString(field_name, ""));143     }144 145     public String RecordString(String field_name, String def)146     {147         if (null == _CurrentRecord)148             return (def);149 150         try151         {152 153             XmlElement e = _CurrentRecord[field_name];154             if (null == e)155                 return (def);156 157             return (e.InnerText);158 159         }160         catch (Exception)161         {162 163             return (def);164         }165     }166 167     public Int16 RecordInt16(String field_name)168     {169         return (RecordInt16(field_name, 0));170     }171 172     public Int16 RecordInt16(String field_name, Int16 def)173     {174         if (null == _CurrentRecord)175             return (0);176 177         String str = RecordString(field_name);178         try179         {180             Int16 v = Int16.Parse(str);181             return (v);182         }183         catch (Exception)184         {185             return (def);186         }187     }188 189     public Int32 RecordInt(String field_name)190     {191         return (RecordInt(field_name, 0));192     }193 194     public Int32 RecordInt(String field_name, Int32 def)195     {196         if (null == _CurrentRecord)197             return (0);198 199         String str = RecordString(field_name);200         try201         {202             Int32 v = Int32.Parse(str);203             return (v);204         }205         catch (Exception)206         {207             return (def);208         }209     }210 211     public Int64 RecordInt64(String field_name)212     {213         return (RecordInt64(field_name, 0));214     }215 216     public Int64 RecordInt64(String field_name, Int64 def)217     {218         if (null == _CurrentRecord)219             return (0);220 221         String str = RecordString(field_name);222         try223         {224             Int64 v = Int64.Parse(str);225             return (v);226         }227         catch (Exception)228         {229             return (def);230         }231     }232 233     public String[] RecordStringArray(String field_name)234     {235         return (RecordStringArray(field_name, ",", 0));236     }237 238     public String[] RecordStringArray(String field_name, Int32 match_count)239     {240         return (RecordStringArray(field_name, ",", match_count));241     }242 243     public String[] RecordStringArray(String field_name, String split)244     {245         return (RecordStringArray(field_name, split, 0));246     }247 248     public String[] RecordStringArray(String field_name, String split, Int32 match_count)249     {250         if (null == _CurrentRecord)251             return (new String[0]);252 253         String str = RecordString(field_name);254 255         String[] splits = str.Split(split.ToCharArray());256         Int32 split_count = splits.Length;257 258         if (0 < match_count && match_count != split_count)259             return (new String[0]);260 261         if (1 == split_count && 0 >= splits[0].Length)262             split_count = 0;263 264         try265         {266             String[] ar = new String[split_count];267             for (Int32 i = 0; i < split_count; i++)268                 ar[i] = splits[i];269             return (ar);270         }271         catch (Exception)272         {273             return (new String[0]);274         }275     }276 277     public String[][] RecordStringArray2(String field_name, String split1, String split2)278     {279         if (null == _CurrentRecord)280             return (new String[0][]);281 282         String str = RecordString(field_name);283 284         String[] splits1 = str.Split(split1.ToCharArray());285         Int32 split_count1 = splits1.Length;286 287         if (1 == split_count1 && 0 >= splits1[0].Length)288             split_count1 = 0;289 290         try291         {292             String[][] ar = new String[split_count1][];293             for (Int32 i = 0; i < split_count1; i++)294             {295                 String s = splits1[i];296                 String[] splits2 = s.Split(split2.ToCharArray());297                 Int32 split_count2 = splits2.Length;298                 if (1 == split_count2 && 0 >= splits2[0].Length)299                     split_count2 = 0;300                 ar[i] = new String[split_count2];301                 for (Int32 j = 0; j < split_count2; j++)302                 {303                     ar[i][j] = splits2[j];304                 }305             }306             return (ar);307 308         }309         catch (Exception)310         {311             return (new String[0][]);312         }313     }314 315     public Int32[] RecordIntArray(String field_name)316     {317         return (RecordIntArray(field_name, ",", 0));318     }319 320     public Int32[] RecordIntArray(String field_name, Int32 match_count)321     {322         return (RecordIntArray(field_name, ",", match_count));323     }324 325     public Int32[] RecordIntArray(String field_name, String split)326     {327         return (RecordIntArray(field_name, split, 0));328     }329 330     public Int32[] RecordIntArray(String field_name, String split, Int32 match_count)331     {332         if (null == _CurrentRecord)333             return (new Int32[0]);334 335         String str = RecordString(field_name);336 337         String[] splits = str.Split(split.ToCharArray());338         Int32 split_count = splits.Length;339 340         if (0 < match_count && match_count != split_count)341             return (new Int32[0]);342 343         if (1 == split_count && 0 >= splits[0].Length)344             split_count = 0;345 346         try347         {348             Int32[] ar = new Int32[split_count];349             for (Int32 i = 0; i < split_count; i++)350                 ar[i] = Int32.Parse(splits[i]);351             return (ar);352         }353         catch (Exception)354         {355             return (new Int32[0]);356         }357     }358 359     public Int32[][] RecordIntArray2(String field_name, String split1, String split2)360     {361         if (null == _CurrentRecord)362             return (new Int32[0][]);363 364         String str = RecordString(field_name);365 366         String[] splits1 = str.Split(split1.ToCharArray());367         Int32 split_count1 = splits1.Length;368 369         if (1 == split_count1 && 0 >= splits1[0].Length)370             split_count1 = 0;371 372         try373         {374             Int32[][] ar = new Int32[split_count1][];375             for (Int32 i = 0; i < split_count1; i++)376             {377                 String s = splits1[i];378                 String[] splits2 = s.Split(split2.ToCharArray());379                 Int32 split_count2 = splits2.Length;380                 if (1 == split_count2 && 0 >= splits2[0].Length)381                     split_count2 = 0;382                 ar[i] = new Int32[split_count2];383                 for (Int32 j = 0; j < split_count2; j++)384                 {385                     ar[i][j] = Int32.Parse(splits2[j]);386                 }387             }388             return (ar);389 390         }391         catch (Exception)392         {393             return (new Int32[0][]);394         }395     }396 397     public Int64[] RecordInt64Array(String field_name)398     {399         return (RecordInt64Array(field_name, ",", 0));400     }401 402     public Int64[] RecordInt64Array(String field_name, Int64 match_count)403     {404         return (RecordInt64Array(field_name, ",", match_count));405     }406 407     public Int64[] RecordInt64Array(String field_name, String split)408     {409         return (RecordInt64Array(field_name, split, 0));410     }411 412     public Int64[] RecordInt64Array(String field_name, String split, Int64 match_count)413     {414         if (null == _CurrentRecord)415             return (new Int64[0]);416 417         String str = RecordString(field_name);418 419         String[] splits = str.Split(split.ToCharArray());420         Int32 split_count = splits.Length;421 422         if (0 < match_count && match_count != split_count)423             return (new Int64[0]);424 425         if (1 == split_count && 0 >= splits[0].Length)426             split_count = 0;427 428         try429         {430             Int64[] ar = new Int64[split_count];431             for (Int32 i = 0; i < split_count; i++)432                 ar[i] = Int64.Parse(splits[i]);433             return (ar);434         }435         catch (Exception)436         {437             return (new Int64[0]);438         }439     }440 441     public Int64[][] RecordInt64Array2(String field_name, String split1, String split2)442     {443         if (null == _CurrentRecord)444             return (new Int64[0][]);445 446         String str = RecordString(field_name);447 448         String[] splits1 = str.Split(split1.ToCharArray());449         Int32 split_count1 = splits1.Length;450 451         if (1 == split_count1 && 0 >= splits1[0].Length)452             split_count1 = 0;453 454         try455         {456             Int64[][] ar = new Int64[split_count1][];457             for (Int32 i = 0; i < split_count1; i++)458             {459                 String s = splits1[i];460                 String[] splits2 = s.Split(split2.ToCharArray());461                 Int32 split_count2 = splits2.Length;462                 if (1 == split_count2 && 0 >= splits2[0].Length)463                     split_count2 = 0;464                 ar[i] = new Int64[split_count2];465                 for (Int32 j = 0; j < split_count2; j++)466                 {467                     ar[i][j] = Int64.Parse(splits2[j]);468                 }469             }470             return (ar);471 472         }473         catch (Exception)474         {475             return (new Int64[0][]);476         }477     }478 479     public void Close()480     {481         _CurrentRecord = null;482         _CurrentRecords = null;483         _CurrentConfig = null;484         _Root = null;485         _Document = null;486     }487 488     public String XmlPath(String file_title)489     {490         return (String.Format("Xml/{0}", file_title));491     }492 493     public String XmlContent(String file_title)494     {495         return (LoadText(XmlPath(file_title)));496     }497 498     public String LoadText(String name)499     {500         String text;501         lock (_LoadedTexts)502         {503             if (_LoadedTexts.TryGetValue(name, out text))504                 return (text);505         }506 507         UnityObject obj = Resources.Load(name);508         if (null == obj)509             return ("");510         if (!(obj is TextAsset))511             return ("");512         text = obj.ToString();513 514         lock (_LoadedTexts)515         {516             _LoadedTexts.Add(name, text);517         }518 519         return (text);520     }521 522     private XmlDocument _Document;523     private XmlElement _Root;524     private XmlElement _CurrentConfig;525     private IEnumerator _CurrentRecords = null;526     private XmlElement _CurrentRecord;527 528     private LoadedTexts _LoadedTexts = new LoadedTexts();529 }

xml文件范例

 1 <?xml version="1.0"?> 2 <fcm count="1"> 3     <CFG0 count="2"> 4     <RECORD0> 5       <area_id>1</area_id> 6       <area_name>1区 狮子座</area_name> 7       <area_state>新区</area_state> 8       <state_code>0</state_code> 9     </RECORD0>10     <RECORD1>11       <area_id>2</area_id>12       <area_name>2区 狮子座</area_name>13       <area_state>新区</area_state>14       <state_code>0</state_code>15     </RECORD1>16     </CFG0>17 </fcm>

 

使用范例

 1         public override void OnInitialize() 2         { 3             XmlReader = new XmlReader (); 4             if ( cfg.Open( "areas" ) ) 5             { 6                 cfg.SeekConfig(); 7                 Int32 record_count = cfg.RecordCount; 8                 for ( Int32 i = 0; i < record_count; i++ ) 9                 {10                     if ( cfg.SeekNextRecord() )11                     {12                         Int32 area_id= cfg.RecordInt( "area_id" );13                         String area_name= cfg.RecordString( "area_name" );14                     }15                 }16             }17             else18             {19                 String title = "No Exit Xml file : ";20                 title += TableConfig.XmlTitle( TableConfigType.Resource );21                 UnityEngine.Debug.LogWarning( "" + title );22             }23             cfg.Close();24         }

 

C# XmlReader