在利用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解析:请多指教