2017-06-05 5 views
0

私はこのようなXMLファイルを持っています。2つの属性を持つ複数の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を使用してドキュメントをロードします。

そして、私はtargetAttrslinkAttrsの2つを持っています。

私はこのコードを使用して値を取得しています。

 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に属します。 外部ループが要素を検出します。 次に、内部ループは同じノードを探して2番目の属性を表示します。

ノードを一度検索し、両方の属性を表示します。代わりに使用LINQ XDocumentをしてDictionaryに変換:

 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に代わるものをお勧めします

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

最初の2つの回答は私が探していたものですが、あなたと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()); 
     } 


    } 

} 
関連する問題