2017-06-05 58 views
0

我有一个这样的XML文件;如何加载多个具有两个属性的XML节点作为键值对?

<?xml version="1.0" encoding="utf-8"?> 
<Data> 
    <StringMaps> 
    <Menu> 
     <String Target="BtnFile" Link="Файл" /> 
     <String Target="BtnOpen" Link="Открыто" /> 
     <String Target="BtnSave" Link="Сохранить" /> 
     <String Target="BtnClose" Link="Закрыть" /> 
    </Menu> 
    </StringMaps> 
</Data> 

我使用XmlDocument加载文档。

然后我有两个XmlNodeList这是targetAttrslinkAttrs

我使用此代码来获取值;

 var targetAttrs = xmldoc1.SelectNodes("/Data/StringMaps/Menu/String/@Target"); 
     var linkAttrs = xmldoc1.SelectNodes("/Data/StringMaps/Menu/String/@Link"); 
     foreach (XmlNode temptarget in targetAttrs) 
     { 
      foreach (XmlNode templink in linkAttrs) 
      { 
       MessageBox.Show(string.Format("{0} = {1}", temptarget.Value, templink.Value)); 
      } 
     } 

我想获得值作为这些键值对;

BtnFile = Файл 
BtnOpen = Открыто 
BtnSave = Сохранить 
BtnClose = Закрыть 

但我得到这些;

BtnFile = Файл 
BtnFile = Открыто 
BtnFile = Сохранить 
BtnFile = Закрыть 
BtnOpen = Файл 
BtnOpen = Открыто 
BtnOpen = Сохранить 
BtnOpen = Закрыть 
BtnSave = Файл 
BtnSave = Открыто 
BtnSave = Сохранить 
BtnSave = Закрыть 
BtnClose = Файл 
BtnClose = Открыто 
BtnClose = Сохранить 
BtnClose = Закрыть 

如果有人写代码并解释确切的逻辑,我将不胜感激。

回答

1

你想要的属性属于同一个XMLNode。 你的外部循环找到了这些元素。 然后你的内循环寻找相同的节点来显示第二个属性。

搜索一次节点并显示两个属性。

 var MenuItems =xmldoc1.SelectNodes("/Data/StringMaps/Menu/String"); 

     foreach(XmlNode MenuItem in MenuItems) 
     { 
      MessageBox.Show(string.Format("{0} ={1}",MenuItem.Attributes["Target"].Value, MenuItem.Attributes["Link"].Value)); 

     } 
2
var strings = xmldoc1.SelectNodes("/Data/StringMaps/Menu/String"); 
foreach (var node in strings) 
{ 
    MessageBox.Show($"{node.Attributes["Target"].Value} = {node.Attributes["Link"].Value}"); 
} 
+0

这个工作和我的想法, 谢谢! 但MessageBox中的字符串之前的美元符号是用于像格式(如string.Format)? –

+0

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interpolated-strings – silencedmessage

0

我建议替代XmlDocument:使用LINQ XDocument代替,改造它Dictionary

var xml = @"<?xml version=""1.0"" encoding=""utf-8""?> 
<Data> 
<StringMaps> 
    <Menu> 
    <String Target=""BtnFile"" Link=""Файл"" /> 
    <String Target=""BtnOpen"" Link=""Открыто"" /> 
    <String Target=""BtnSave"" Link=""Сохранить"" /> 
    <String Target=""BtnClose"" Link=""Закрыть"" /> 
    </Menu> 
</StringMaps> 
</Data>"; 

XDocument xdoc = XDocument.Parse(xml); 

var dict = xdoc 
    .Descendants("String") 
    .ToDictionary(n => n.Attribute("Target").Value, n => n.Attribute("Link").Value); 

foreach (var keyValuePair in dict) 
{ 
    MessageBox.Show($"{keyValuePair.Key} = {keyValuePair.Value}"); 
} 
+1

前两个答案是我一直在寻找,但你和jdweng的答案是很好的选择阅读/解析xml文档。谢谢你的时间! –

0

使用XML LINQ:

using System.Collections.ObjectModel; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 


namespace ConsoleApplication57 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 
      Dictionary<string,string> dict = doc.Descendants("String") 
       .GroupBy(x => (string)x.Attribute("Target"), y => (string)y.Attribute("Link")) 
       .ToDictionary(x => x.Key, y => y.FirstOrDefault()); 
     } 


    } 

} 
相关问题