如何使用Linq从XmlNodeList中提取某些数据并将其加载到C#中的字典中

时间:2017-10-04 20:19:24

标签: c# linq

我有一些C#代码,它使用System.Xml来解析xml文件,然后将某些数据从xml中提取到字典中。

下面的代码有效,但它非常混乱,我真的不喜欢它。我想将它折叠成一些简单的Linq调用,但我仍然对Linq很新,我不知道从哪里开始。任何人都可以提供一些关于Linq-ify这段代码的建议吗? (最好是方法语法)

另外因为代码将数据写入外部数据结构(字典),我不知道这对Linq有什么作用。

XML示例数据:

<Localisation>

    <LOC_TAG value="tag_01" >
        <LOC_TEXT language="English" value="This is some text"/>
        <LOC_TEXT language="German" value="Das ist ein Text"/>
        <LOC_TEXT language="French" value="Il s'agit d'un texte"/>
    </LOC_TAG>

    <LOC_TAG value="tag_02" >
        <LOC_TEXT language="English" value="Another text string"/>
    </LOC_TAG>

</Localisation>

C#代码

Dictionary<string, string>  Strings = new Dictionary<string, string>();

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(new StringReader(locFile.text));

// Read each LOC_TAG and pull out its LOC_TEXT matching the required language into the dictionary
XmlNodeList locTags = xmlDoc.GetElementsByTagName("LOC_TAG");
foreach (XmlNode locTagNode in locTags)
{
    foreach (XmlNode child in locTagNode.ChildNodes)
    {
        if (child.Name == "LOC_TEXT" && 
            child.Attributes["language"].Value == Application.systemLanguage.ToString())
        {
            Strings.Add(locTagNode.Attributes["value"].Value, 
                        child.Attributes["value"].Value);
            break;
        }
    }
}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

这是LINQ等价物:

git://

答案 1 :(得分:0)

由于查询正在迭代XmlNodes,我们可以随时使用tag.ParentNode获取当前节点的父节点,这使得工作更容易。

var strings = (from tag in locTags.Cast<XmlNode>().SelectMany(t => t.ChildNodes.Cast<XmlNode>())
    where tag.Name == "LOC_TEXT" && tag.Attributes["language"].Value == Application.systemLanguage.ToString()
    select new { key = tag.ParentNode.Attributes["value"].Value, value = tag.Attributes["value"].Value })
    .ToDictionary(t=>t.key, t=>t.value);