首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。