XDocument возвращает все имена и значения элементов в два отдельных списка - PullRequest
1 голос
/ 02 июля 2019

У меня есть XML-документ, который выглядит следующим образом:

<Settings>
  <!-- Comment1 -->
  <A> 1 </A>
  <!-- Comment2 -->
  <B> 2 </B>
  <!-- Comment3 -->
  <C> 3 </C>
  <!-- Comment4 -->
  <D> 4 </D>
</Settings>

Как добавить имена элементов (A, B, C, D) в список, а также значения элементов (1,2,3,4) в другой список.Обратите внимание, что на самом деле XML-файл, с которым я имею дело, содержит более 1000 строк кода, поэтому мне нужен более эффективный способ, чем просто извлекать каждое значение и элемент по одному и добавлять его в список ...

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Чтобы разобрать часть Xml в словарь, используя LinqToXML Загрузите ваш Xdocument.
Выберите все в настройках. Перечислите эти элементы и сделайте их словарём.

Если имеются дублирующие элементы, замените ToDictionary на Select.

string input = @"<root>
<Settings>
    <A> 1 </A>
    <B> 2 </B>
    <C> 3 </C>
    <D> 4 </D>
</Settings>
<Hello>World</Hello>
<Foo>Bar</Foo>
</root>";

XDocument xdoc = XDocument.Parse(input);

var result = xdoc.Descendants("Settings")
    .Elements()
    .ToDictionary(
        el => el.Name.LocalName,
        el => el.Value 
    );

Результат:

Dumping object(System.Collections.Generic.Dictionary`2[String,String])
  [
   [A,  1 ]
   ,
   [B,  2 ]
   ,
   [C,  3 ]
   ,
   [D,  4 ]
]

Значение возрастания, например settings["A"].

LiveDemo


NB: здесь словарь "[String,String]", но вы можете преобразовать значение в соответствии со своими потребностями.
0 голосов
/ 02 июля 2019

Вы можете попробовать этот код.

class Program
    {
        static void Main(string[] args)
        {
            //Declare and load your xml file
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("XMLFile.xml");

            //Instatiate the object where you want to store the list values
            XMLData xmlData = new XMLData();
            xmlData.listKeys = new List<string>();
            xmlData.listValues = new List<string>();

            //Pick the settings parent node 
            XmlNode xmlSettingsNode = xmlDoc.FirstChild;

            //Loop through the list and add name and values to list
            foreach (XmlNode xmlNode in xmlSettingsNode.ChildNodes)
            {
                //Ignore commented lines
                if (xmlNode.NodeType != XmlNodeType.Comment)
                {
                    xmlData.listKeys.Add(xmlNode.Name);
                    xmlData.listValues.Add(xmlNode.InnerText);
                }
            }
        }
    }

//Data model for storing list data
    public class XMLData
    {
       public List<string> listKeys { get; set; }
       public List<string> listValues { get; set; }

    }
...