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

XML解析报错:名称中不可包含冒号(0x3A),求修复方案

修复XML电子表格生成代码的报错问题

咱们一步步来搞定这个问题哈,你碰到的「字符":"不能包含在名称中」错误,其实是代码里几个语法/拼写小问题闹的,不是XML里用命名空间冒号本身的问题(XML里前缀加冒号是完全合法的)。

具体修复点:

  • 修正XProcessingInstruction的拼写错误:你代码里写成了XProcessing**Instruction,多了两个星号,这会导致编译器解析异常,进而引发错误提示。
  • 正确声明并赋值返回变量:你创建了XDocument但没把它赋值给要返回的xmlssDoc,甚至连这个变量都没声明,这是很明显的语法疏漏。
  • 修正命名空间里的无效空格:xmlns:ss的属性值里microsoft-后面多了个空格,应该改成urn:schemas-microsoft-com:office:spreadsheet,这个错误会导致命名空间定义无效,触发XML名称校验错误。
  • 优化GetRows的返回类型(可选但更规范):把返回Object[]改成IEnumerable<XElement>,因为我们实际需要的是XElement集合,类型更明确,避免潜在的类型转换问题。

修复后的完整代码:

public static XDocument GenerateXMLSpreadSheet(DataTable tbl) {
    // 声明并赋值返回的XDocument变量
    var xmlssDoc = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"),
        // 去掉多余的**,修正拼写
        new XProcessingInstruction("mso-application", "Excel.Sheet"),
        new XElement("Workbook",
            new XAttribute("xmlns", "urn:schemas-microsoft-com:office:spreadsheet"),
            // 修正命名空间值里的空格,用标准方式创建命名空间属性
            new XAttribute(XNamespace.Xmlns + "ss", "urn:schemas-microsoft-com:office:spreadsheet"),
            new XElement("Worksheet",
                // 用命名空间对象创建带前缀的属性,更规范
                new XAttribute(XNamespace.Get("urn:schemas-microsoft-com:office:spreadsheet") + "Name", tbl.TableName),
                new XElement("Table", GetRows(tbl))
            )
        )
    );
    return xmlssDoc;
}

// 优化返回类型为IEnumerable<XElement>,贴合实际需求
public static IEnumerable<XElement> GetRows(DataTable tbl) {
    var rows = new List<XElement>();
    // 示例:生成表头行
    rows.Add(new XElement("Row", 
        tbl.Columns.Cast<DataColumn>().Select(col => 
            new XElement("Cell", new XElement("Data", new XAttribute("ss:Type", "String"), col.ColumnName))
        )
    ));
    // 生成数据行
    foreach (DataRow row in tbl.Rows) {
        rows.Add(new XElement("Row",
            tbl.Columns.Cast<DataColumn>().Select(col => 
                new XElement("Cell", new XElement("Data", new XAttribute("ss:Type", "String"), row[col].ToString()))
            )
        ));
    }
    return rows;
}

额外说明:

对于带命名空间的属性(比如ss:Name),用XNamespace.Get(...) + "Name"的方式创建是LINQ to XML处理命名空间的标准写法,比直接写字符串更不容易出错。如果你的GetRows方法原本就正确生成XElement集合,只需要修改返回类型即可,上面的示例补充了表头和数据行的生成逻辑,供你参考。

内容的提问来源于stack exchange,提问作者dconner2006

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:21:11