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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:59:39