You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:21:16