如何将XML属性转Excel并修改type="unfinished"的翻译内容?
解决XML中
type="unfinished"翻译名称的修改问题 首先得说清楚为啥移除type属性后程序能正常跑——因为你原来用DataSet.ReadXml读取XML时,元素的属性会被自动当成单独的数据列。保留type属性的话,DataSet里的表会多出一列(比如叫translation_type),可能干扰了你原本的导出逻辑;而移除属性后,结构只剩source和translation两列,程序自然就正常了。
但你需要的是修改那些带有type="unfinished"的<translation>元素的文本内容,这里给你两种实用的解决方案:
方案一:用LINQ to XML(XDocument)直接操作XML节点(推荐)
这种方式更灵活,能精准定位到需要修改的翻译节点,还能自定义Excel导出的内容(比如要不要显示翻译状态)。代码调整如下:
// 加载XML文件 XDocument doc = XDocument.Load("original.xml"); // 精准筛选出所有type="unfinished"的translation元素 var unfinishedTranslations = doc.Descendants("translation") .Where(trans => trans.Attribute("type")?.Value == "unfinished"); // 批量修改翻译内容,这里示例改成"待翻译",你换成自己需要的文本就行 foreach (var trans in unfinishedTranslations) { trans.Value = "待翻译"; } // 可选:先保存修改后的XML文件 doc.Save("modified.xml"); // 接下来执行Excel导出逻辑 xlApp = new Microsoft.Office.Interop.Excel.Application(); xlWorkBook = xlApp.Workbooks.Add(misValue); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); if (xlApp == null) { MessageBox.Show("Excel is not properly installed!!"); return; } // 自定义表头(可选,让Excel内容更清晰) xlWorkSheet.Cells[1, 1] = "Source Text"; xlWorkSheet.Cells[1, 2] = "Translation"; xlWorkSheet.Cells[1, 3] = "Translation Status"; // 遍历XML节点写入Excel,避免DataSet的属性自动拆分问题 int currentRow = 2; foreach (var messageNode in doc.Descendants("message")) { string source = messageNode.Element("source")?.Value ?? string.Empty; string translation = messageNode.Element("translation")?.Value ?? string.Empty; string status = messageNode.Element("translation")?.Attribute("type")?.Value ?? "finished"; xlWorkSheet.Cells[currentRow, 1] = source; xlWorkSheet.Cells[currentRow, 2] = translation; xlWorkSheet.Cells[currentRow, 3] = status; currentRow++; } // 收尾工作和你原来的代码一致 xlWorkBook.SaveAs("original2.xlsx"); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlApp); releaseObject(xlWorkBook); releaseObject(xlWorkSheet); MessageBox.Show("Conversion Completed !! ");
方案二:基于原有的DataSet逻辑修改
如果你不想大改代码,也可以直接在DataSet读取XML后,修改对应行的翻译内容。因为DataSet会把translation的type属性转成translation_type列,我们只要找到这列值为unfinished的行,修改translation列即可:
xlApp = new Microsoft.Office.Interop.Excel.Application(); xlWorkBook = xlApp.Workbooks.Add(misValue); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xmlFile = XmlReader.Create("original.xml", new XmlReaderSettings()); ds.ReadXml(xmlFile); if (xlApp == null) { MessageBox.Show("Excel is not properly installed!!"); return; } else { // 新增:修改DataSet中未完成的翻译内容 foreach (DataRow row in ds.Tables[0].Rows) { // 判断translation_type列是否为unfinished if (row["translation_type"]?.ToString() == "unfinished") { row["translation"] = "待翻译"; // 替换成你的目标文本 } } // 原来的导出逻辑不变 for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) { for (int j = 0; j <= ds.Tables[0].Columns.Count - 1; j++) { xlWorkSheet.Cells[i + 1, j + 1] = ds.Tables[0].Rows[i].ItemArray[j].ToString(); } } xlWorkBook.SaveAs("original2.xlsx"); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlApp); releaseObject(xlWorkBook); releaseObject(xlWorkSheet); MessageBox.Show("Conversion Completed !! "); }
两种方案各有优劣:方案一适合需要精细控制XML内容或自定义Excel输出的场景;方案二更贴近你原有的代码,改动最小。
内容的提问来源于stack exchange,提问作者Bogdan Salajan
相关产品推荐
相关产品推荐

