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
相关产品推荐
相关产品推荐

