XML解析中文字符

      在利用c#解析xml文件的时候,如果xml文件中包含中文字符,可能会遇到如下出错提示:"异常详细信息: System.Xml.XmlException: 给定编码中有无效的字符。 行 2,位置 26。"如果我们的代码没有任何问题,那么就应该是xml文件表头有问题,改成:"<?xml version=1.0 encoding=gb2312?>"即可,因为默认的表格式只支持Ascii码格式文件,不支持中文字符。

解析方法:举例如下,其中ConfigLayer是自定义的结构体,存储三个变量,From,To,Clip.而xml文件的基本内容如下:

 1 <?xml version="1.0" encoding="gb2312"?>
 2 <ExportConfig>
 3 <Layer>
 4 <From>BOUA</From>
 5 <To>BOUA</To>
 6 <Clip>true</Clip>
 7 </Layer>
 8 <Layer>
 9 <From>中国</From>
10 <To>中国</To>
11 <Clip>true</Clip>
12 </Layer>
13 <Layer>
14 <From>BOUP</From>
15 <To>BOUP</To>
16 <Clip>true</Clip>
17 </Layer>
18 <Layer>
19 <From>BANP</From>
20 <To>BANP</To>
21 <Clip>true</Clip>
22 </Layer>
23 <Layer>
24 <From>VEGA</From>
25 <To>VEGA</To>
26 <Clip>true</Clip>
27 </Layer>
28 <Layer>
29 <From>VEGP</From>
30 <To>VEGP</To>
31 <Clip>true</Clip>
32 </Layer>
33 <Layer>
34 <From>VEGL</From>
35 <To>VEGL</To>
36 <Clip>true</Clip>
37 </Layer>
38 </ExportConfig>

则将xml文件内容解析到内存中可通过如下方式:

 1 public static List<ConfigLayer> AnalyseXmlDoc(string xmlPath)
 2         {
 3             try
 4             {
 5                 if (xmlPath == null)
 6                     return null;
 7                 List<ConfigLayer> configLayerList = new List<ConfigLayer>();
 8                 XmlDocument xmlDoc = new XmlDocument();
 9                 xmlPath = xmlPath.Trim();
10                 xmlDoc.Load(xmlPath);
11                 XmlNodeReader pNodeReader = new XmlNodeReader(xmlDoc);
12                 while (pNodeReader.Read())
13                 {
14                     if (pNodeReader.NodeType == XmlNodeType.Element)
15                     {
16                         if (pNodeReader.Name == "Layer")
17                         {
18                             ConfigLayer configLayer=GetValuesByClassName(pNodeReader.Name, pNodeReader);
19                             configLayerList.Add(configLayer);
20                         }
21                     }
22                 }
23                 pNodeReader.Close();
24                 pNodeReader = null;
25                 xmlDoc = null;
26                 return configLayerList;
27             }
28             catch (Exception ex)
29             {
30                 MessageBox.Show("配置文件解析出错:" + ex.Message);
31                 return null;
32             }
33         }
34 
35         public static ConfigLayer GetValuesByClassName(string name, XmlReader pNodeReader)
36         {
37             //List<ConfigLayer> ConfigLayerList = new List<ConfigLayer>();
38             ConfigLayer layerInfo = new ConfigLayer();
39             while (pNodeReader.Read())
40             {               
41                 if (pNodeReader.Name == "Layer" && pNodeReader.NodeType == XmlNodeType.EndElement) break;
42                 switch (pNodeReader.Name)
43                 {
44                     case "From":
45                         layerInfo.From = pNodeReader.ReadString();
46                         break;
47                     case "To":
48                         layerInfo.To = pNodeReader.ReadString();
49                         break;
50                     case "Clip":
51                         string clip = pNodeReader.ReadString();
52                         if (clip == "false")
53                         {
54                             layerInfo.Clip = false;
55                             break;
56                         }
57                         else
58                         {
59                             layerInfo.Clip = true;
60                             break;
61                         }                           
62                 }
63                 //ConfigLayerList.Add(layerInfo);
64             }
65             return layerInfo;         
66         }


初学xml解析:请多指教

posted @ 2012-04-19 17:37  呆呆瓜  阅读(3233)  评论(0编辑  收藏  举报