CSV转XML代码报错:名称中不能包含空格(0x20)字符
解决XML元素名称包含空格的错误
问题原因
你遇到的System.Xml.XmlException错误,核心原因是XML规范不允许元素名称包含空格(十六进制0x20)。你的代码直接将CSV表头字段或文件名作为XML元素名,当这些名称里存在空格时(比如CSV表头有User Name这类字段,或CSV文件名本身带空格),就会触发该错误。
修复方案
需要对用作XML元素名的字符串进行清理,把空格替换为合法字符(如下划线_),或过滤所有XML非法字符。以下是两种可行实现:
方式1:简单替换空格
直接在获取文件名和表头时替换空格:
internal class Program { private static void Main(string[] args) { var csvFile = @"sbor.csv"; var xmlFile = @"sbor.xml"; var xml = ConvertCSVToXml(csvFile); File.WriteAllText(xmlFile, xml.ToString()); Console.WriteLine("CSV converted to XML successfully."); } private static XElement ConvertCSVToXml(string csvFile) { XElement root = new XElement("xml"); // 替换文件名中的空格为下划线 var nodeName = Path.GetFileNameWithoutExtension(csvFile).Replace(" ", "_"); var lines = File.ReadAllLines(csvFile); // 替换表头中的空格为下划线 var headers = lines[0].Split(',').Select(header => header.Trim().Replace(" ", "_")).ToArray(); var dataLines = lines.Skip(1); dataLines.ToList().ForEach(line => { var node = new XElement(nodeName); var data = line.Split(',').Select(field => field.Trim()).ToList(); for (int i = 0; i < headers.Length; i++) { node.Add(new XElement(headers[i], data[i])); } root.Add(node); }); return root; } }
方式2:严谨过滤所有非法字符
使用XmlConvert类判断字符合法性,确保生成的元素名完全符合XML规范:
internal class Program { private static void Main(string[] args) { var csvFile = @"sbor.csv"; var xmlFile = @"sbor.xml"; var xml = ConvertCSVToXml(csvFile); File.WriteAllText(xmlFile, xml.ToString()); Console.WriteLine("CSV converted to XML successfully."); } private static XElement ConvertCSVToXml(string csvFile) { XElement root = new XElement("xml"); var nodeName = SanitizeXmlName(Path.GetFileNameWithoutExtension(csvFile)); var lines = File.ReadAllLines(csvFile); var headers = lines[0].Split(',').Select(header => SanitizeXmlName(header.Trim())).ToArray(); var dataLines = lines.Skip(1); dataLines.ToList().ForEach(line => { var node = new XElement(nodeName); var data = line.Split(',').Select(field => field.Trim()).ToList(); for (int i = 0; i < headers.Length; i++) { node.Add(new XElement(headers[i], data[i])); } root.Add(node); }); return root; } // 清理XML元素名的非法字符 private static string SanitizeXmlName(string name) { if (string.IsNullOrEmpty(name)) return "unknown"; // 替换所有不符合XML名称规范的字符为下划线 return new string(name.Select(c => XmlConvert.IsXmlNameChar(c) ? c : '_' ).ToArray()); } }
补充说明
XML元素名称必须满足W3C规范:
- 不能以数字或标点符号开头
- 不能包含空格、
<、>、&、'、"等特殊字符 - 仅允许包含字母、数字、下划线、连字符、句点等合法字符
通过上述方法处理后,即可避免因非法字符导致的XML创建错误。
内容的提问来源于stack exchange,提问作者Shiryazdan Ushurbakiev
相关产品推荐
相关产品推荐

