IEnumerable <XElement>выбирает один и тот же элемент более одного раза - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь получить данные XML, используя XDocument и Xelement в C#. Я использую IEnumerable<XElement> для перебора всех элементов, которые я хочу получить. Моя проблема в том, что IEnumerable<XElement> извлекает одни и те же данные много раз, и когда я использую цикл foreach, он зацикливается больше, чем количество элементов в моем XML-файле. Это приносит то же самое в каждом цикле. Любые предложения?

Мой XML-файл:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SYSTEM SelectedConfiguration = "5840-0000-0001">
  <Configuration Name = "5840-0000-0001">
     <Users>
        <User>
          <Name>Lebron</Name>
          <Surname>James</Surname>
          <Adress>asdfgh</Adress>
          <Phone>1234</Phone>
          <Gender>Male</Gender>
          <Country>USA</Country>
        </User>
        <User>
          <Name>Kevin</Name>
          <Surname>Durand</Surname>
          <Adress>asdfghasdfgh</Adress>
          <Phone>4567</Phone>
          <Gender>Male</Gender>
          <Country>USA</Country>
        </User>
        <User>
          <Name>Stephen</Name>
          <Surname>Curry</Surname>
          <Adress>zxcv</Adress>
          <Phone>1267</Phone>
          <Gender>Male</Gender>
          <Country>USA</Country>
        </User>
    </Users>
  </Configuration>  
</SYSTEM>   

Мой код:

 XDocument devices = XDocument.Load(Application.StartupPath + "\\Users.xml");
                    XElement conf = devices.Root.Element("Configuration");

                  /*
                    IEnumerable<XElement> childElements =
                        from el in conf.Element("Instruments").Elements("Instrument")
                        select el;
                   */
                    IEnumerable<XElement> childElements = conf.Element("Users").Elements("User");
                    int counter = childElements.Count();
                    foreach (XElement el in childElements)
                    {


                            DataGridViewRow row = (DataGridViewRow)dataGridView1.Rows[0].Clone();
                            row.Cells[0].Value = el.Element("Name").Value.ToString();
                            row.Cells[1].Value = el.Element("Surname").Value.ToString();
                            row.Cells[2].Value = el.Element("Adress").Value.ToString();

                            dataGridView1.Rows.Add(row);
                           // if (counter-- <= 1)
                               // return;
                    }

Полученные результаты:

Нажмите здесь, чтобы увидеть изображение

Нажмите здесь, чтобы увидеть изображение 2

Нажмите здесь, чтобы увидеть изображение 3

Как видно на изображениях, существует более одного Леброна Джеймса или Кевина Дюранда, и foreach просматривает каждую комбинацию этих узлов, как показано наИзображение 3.

Редактировать 1:

Программа возвращается к строке IEnumerable<XElement> childElements = conf.Element("Users").Elements("User"); несколько раз. Счетчик получает 3 снова и снова.

1 Ответ

1 голос
/ 08 октября 2019

Это сработало для меня, пожалуйста, посмотрите.

XDocument devices = XDocument.Load(Application.StartupPath + "\\Users.xml");
XElement conf = devices.Root.Element("Configuration");

List < string > list = new List < string > ();
IEnumerable < XElement > childElements = conf.Element("Users").Elements("User");
var dataList = childElements.Select(el => new {
 Name = el.Element("Name").Value.ToString(),
  Surname = el.Element("Surname").Value.ToString(),
  Adress = el.Element("Adress").Value.ToString()
});

foreach(var userInfo in dataList) {
 list.Add($ "{userInfo.Name}:{userInfo.Surname}:{userInfo.Adress}");
}
...