Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Linq从XmlNodeList中提取特定数据并将其加载到C中的字典中#_C#_Linq - Fatal编程技术网

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

C# 如何使用Linq从XmlNodeList中提取特定数据并将其加载到C中的字典中#,c#,linq,C#,Linq,我有一些C#代码,它使用System.Xml解析Xml文件,然后将Xml中的某些数据拉入字典 下面的代码可以工作,但它相当混乱,我真的不喜欢它。我想把它分解成一些简单的Linq调用,但我对Linq还是很陌生,不知道从哪里开始。有人能提供一些关于如何Linq-ify这段代码的建议吗?(最好使用方法语法) 另外,由于代码将数据写入外部数据结构(字典),我不知道Linq如何工作 XML示例数据: C#代码 字典字符串=新字典(); XmlDocument xmlDoc=新的XmlDocument(

我有一些C#代码,它使用System.Xml解析Xml文件,然后将Xml中的某些数据拉入字典

下面的代码可以工作,但它相当混乱,我真的不喜欢它。我想把它分解成一些简单的Linq调用,但我对Linq还是很陌生,不知道从哪里开始。有人能提供一些关于如何Linq-ify这段代码的建议吗?(最好使用方法语法)

另外,由于代码将数据写入外部数据结构(字典),我不知道Linq如何工作

XML示例数据:

C#代码
字典字符串=新字典();
XmlDocument xmlDoc=新的XmlDocument();
Load(新的StringReader(locFile.text));
//阅读每个LOC_标记,并将与所需语言匹配的LOC_文本放入词典
XmlNodeList locTags=xmlDoc.GetElementsByTagName(“LOC_标记”);
foreach(locTags中的XmlNode-locTagNode)
{
foreach(locTagNode.ChildNodes中的XmlNode子节点)
{
如果(child.Name==“LOC_TEXT”&&
child.Attributes[“language”]。Value==Application.systemLanguage.ToString()
{
Strings.Add(locTagNode.Attributes[“value”].value,
子属性[“值”].value);
打破
}
}
}

非常感谢任何帮助

以下是LINQ等效值:

var language = Application.systemLanguage.ToString();
var strings = XElement.Parse(xml)
    .XPathSelectElements("./LOC_TAG")
    .Select(x => new 
    {
        Tag = x.Attribute("value").Value,
        Text = x.XPathSelectElement($"./LOC_TEXT[@language='{language}']")
            ?.Attribute("value").Value
    })
    .Where(x => x.Text != null)
    .ToDictionary(x => x.Tag, x => x.Text);

由于查询是通过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);
var strings=(来自locTags.Cast()中的标记。SelectMany(t=>t.ChildNodes.Cast())
其中tag.Name==“LOC_TEXT”&&tag.Attributes[“language”]。Value==Application.systemLanguage.ToString()
选择新{key=tag.ParentNode.Attributes[“value”].value,value=tag.Attributes[“value”].value})
.ToDictionary(t=>t.key,t=>t.value);

某种类型的代码转换请求,在我看来应该作为主题外的内容关闭。非常感谢。到目前为止,我还没有重温过Xml.Linq名称空间……这非常有用!
var language = Application.systemLanguage.ToString();
var strings = XElement.Parse(xml)
    .XPathSelectElements("./LOC_TAG")
    .Select(x => new 
    {
        Tag = x.Attribute("value").Value,
        Text = x.XPathSelectElement($"./LOC_TEXT[@language='{language}']")
            ?.Attribute("value").Value
    })
    .Where(x => x.Text != null)
    .ToDictionary(x => x.Tag, x => x.Text);
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);