C # Читать Xml - LinQ - PullRequest
       4

C # Читать Xml - LinQ

0 голосов
/ 17 октября 2019

Я пытаюсь прочитать этот конкретный xml, и я получил «System.Xml.Linq.XContainer.Element (...), возвращенный ноль». ошибка.

XML

  <P>
  <W>
    <WC>
      <A>1</A>
      <B>1</B>
      <C>1</C>
    </WC>
  </W>
  <Modules>
    <Module Attr="ex">
      <A>
        <B>2</B>
        <C>3</C>
        <D>4</D>
        <E>5</E>
        <F>6</G>
        <G>7</G>
      </A>
    </Module>
      <Module Attr="ex2">
      <A>
        <C>3</C>
        <D>4</D>
        <E>5</E>
      </A>
    </Module>
  </Modules>
  <Modules>
    <Module Attr="ex3">
      <A>
        <W>10</W>
        <V>9</V>
      </A>
    </Module>
    <Module Attr="XXXX">
      <A>
        <B>2</B>
        <C>3</C>
        <D>4</D>
        <E>5</E>
        <F>6</G>
        <G>7</G>
      </A>
    </Module>
   </Modules>
</P>

C #

XElement disXelement = XElement.Load($"PATH");

        var modules = from module in disXelement.Element("Modules").Elements("Module") 
                      where module.Attribute("Attr").Value == "XXXX"
                      select new
                      {
                          v = from s in module.Descendants()
                                select new
                                {
                                    Ip = v.Element("F").Value,
                                    Port = v.Element("G").Value
                                }
                      };


        foreach (var item in modules)
        {
            foreach (var i in item.v)
            {
                MessageBox.Show(i.Ip);
                MessageBox.Show(i.Port);
            }
        }

Я хотел бы получить значения F и G.

Я пробовал это:

            var modules2 = disXelement.Element("Modules").Elements("Module")
                      .Where((module) => module.Attribute("Attr").Value == "XXXX")
                      .Select((module) => new
                      {
                          v= module.Descendants().Select((v) => new
                          {
                              Ip = (string)v.Elements().Where(e => e.Name.LocalName == "F").First(),
                              Port = (string)v.Elements().Where(e => e.Name.LocalName == "G").First()
                          })
                      });

Какая работа (получила два значения messageBox, но я получаю ошибку: System.InvalidOperationException: «Последовательность не содержит элементов» в v = module.Descendants () ...

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Это сработало для меня:

      var modules = from module in disXelement.Element("Modules").Elements("Module")
                      where module.Attribute("Attr").Value == "XXXX"
                      select new
                      {
                          Ip = module.Descendants().Where(e => e.Name.LocalName == "F").First()?.Value,
                          Port = module.Descendants().Where(e => e.Name.LocalName == "G").First()?.Value                              
                      };
0 голосов
/ 17 октября 2019
var doc = XDocument.Parse(xml);

foreach (XElement module in doc.Root.Elements())
{
    foreach (XElement letterGroup in module.Elements())
    {
        foreach (XElement letter in letterGroup.Elements())
        {
            switch(letter.Name.LocalName)
            {
                case "F":
                    MessageBox.Show("IP: " + letter.Value);
                    break;
                case "G":
                    MessageBox.Show("Port: " + letter.Value);
                    break;
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...