如何将具有两个属性的多个XML节点作为键值对加载?

时间:2017-06-05 15:52:06

标签: c# xml foreach xml-attribute

我有一个类似的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 = Закрыть

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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 :(得分: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}"); 
}

答案 3 :(得分:0)

使用xml linq:

echo wordwrap($str, 50, '<br>');