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

如何在C#中解析多语言XML并构建嵌套字典实现文本访问

实现XML多语言文本读取并构建嵌套字典(C#)

方法一:使用XDocument手动解析(推荐,适配动态语言节点)

这种方法灵活直接,无需预先定义所有语言类型,完美匹配你的XML结构:

  1. 引入必要命名空间:
using System.Xml.Linq;
using System.Collections.Generic;
  1. 读取XML并构建嵌套字典的代码:
// 读取XML文件(若为字符串形式的XML,可改用XElement.Parse)
var doc = XDocument.Load("你的XML文件路径.xml");

var multiLangDict = new Dictionary<string, Dictionary<string, string>>();

// 遍历每个<Element>节点
foreach (var elementNode in doc.Root.Elements("Element"))
{
    // 获取程序状态名称(取name属性值)
    var stateName = elementNode.Attribute("name")?.Value;
    if (string.IsNullOrEmpty(stateName)) continue;

    var langDict = new Dictionary<string, string>();
    // 遍历当前Element下的所有语言子节点
    foreach (var langNode in elementNode.Elements())
    {
        // 节点名称作为语言标识,节点内容作为对应文本
        langDict.Add(langNode.Name.LocalName, langNode.Value.Trim());
    }

    multiLangDict.Add(stateName, langDict);
}

// 访问示例
var germanStartText = multiLangDict["Start"]["German"]; // 输出 "Starte hier."

方法二:使用XmlSerializer反序列化(需处理动态语言节点)

如果偏好序列化方式,需定义实体类并通过XmlAnyElement捕获动态语言节点:

  1. 定义实体类:
using System.Xml.Serialization;
using System.Xml;
using System.Collections.Generic;

[XmlRoot("Explanations")]
public class Explanations
{
    [XmlElement("Element")]
    public List<LanguageElement> Elements { get; set; }
}

public class LanguageElement
{
    [XmlAttribute("name")]
    public string StateName { get; set; }

    // 捕获所有语言子节点
    [XmlAnyElement]
    public XmlElement[] LanguageNodes { get; set; }

    // 转换为语言字典的辅助属性(序列化时忽略)
    [XmlIgnore]
    public Dictionary<string, string> LanguageDict
    {
        get
        {
            var dict = new Dictionary<string, string>();
            if (LanguageNodes == null) return dict;
            foreach (var node in LanguageNodes)
            {
                dict.Add(node.Name, node.InnerText.Trim());
            }
            return dict;
        }
    }
}
  1. 反序列化并转换为目标字典:
var serializer = new XmlSerializer(typeof(Explanations));
Explanations explanations;

using (var reader = new StreamReader("你的XML文件路径.xml"))
{
    explanations = (Explanations)serializer.Deserialize(reader);
}

var multiLangDict = explanations.Elements.ToDictionary(
    e => e.StateName, 
    e => e.LanguageDict
);

// 访问示例
var englishEndText = multiLangDict["End"]["English"]; // 输出 "It ends here."

注意事项

  • 确保XML文件路径正确,若为嵌入资源需调整读取逻辑。
  • 添加空值判断:比如Attribute("name")可能为null,节点内容也可能为空,避免运行时报错。
  • 新增语言(如French)时,两种方法均无需修改代码,自动适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:31:06