我有一些C#代码,它使用System.Xml来解析xml文件,然后将某些数据从xml中提取到字典中。
下面的代码有效,但它非常混乱,我真的不喜欢它。我想将它折叠成一些简单的Linq调用,但我仍然对Linq很新,我不知道从哪里开始。任何人都可以提供一些关于Linq-ify这段代码的建议吗? (最好是方法语法)
另外因为代码将数据写入外部数据结构(字典),我不知道这对Linq有什么作用。
<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>
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;
}
}
}
非常感谢任何帮助!
答案 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);