簡體   English   中英

C# 讀取 Xml - LinQ

[英]C# Read Xml - LinQ

I'm trying to read this particular xml and I got an "System.Xml.Linq.XContainer.Element(...) returned null." 錯誤。

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()
                          })
                      });

哪個工作(得到兩個消息框的值,但我收到一個錯誤:System.InvalidOperationException:'Sequence contains no elements' at v = module.Descendants()...

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;
                }
            }
        }
    }
}

這對我有用:

      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                              
                      };

嘗試這個:

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

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

給定您的示例數據,它應該為您提供兩個分別顯示 6 和 7 的MessageBoxes 它確實使用以下示例數據:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Modules>
  <Module Attr="XXXX">
    <A>
      <B>2</B>
      <C>3</C>
      <D>4</D>
      <E>5</E>
      <F>6</F>
      <G>7</G>
    </A>
  </Module>
</Modules>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM