Linq to XML - powtarzająca się sekcja

0

Witam,

Mam XML z taką strukturą

<POSITION>
  <ARTICLE_CODE>1OPR13AOPR      </ARTICLE_CODE>
  <ARTICLE_NAME1>-1DFS OPERA S3                                     </ARTICLE_NAME1>

  <ARTICLE_NR>1DFSOPRO0030                                       </ARTICLE_NR>

  <REALIS_DATE_TO>2016-12-29</REALIS_DATE_TO>

  <WARIANT>
    <WARIANT_CODE>KORPUS</WARIANT_CODE>
    <WARIANT_SPEC>KORPUS</WARIANT_SPEC>
    <WARIANT_REALIS_CODE>T1277577         </WARIANT_REALIS_CODE>
    <WARIANT_REALIS_SPEC>SHERGAR ASH ADR                                   </WARIANT_REALIS_SPEC>
    <ATTENTION />
  </WARIANT>
  <WARIANT>
    <WARIANT_CODE>PODOZD</WARIANT_CODE>
    <WARIANT_SPEC>PODUSZKI OZDOBNE</WARIANT_SPEC>
    <WARIANT_REALIS_CODE>T13144423         </WARIANT_REALIS_CODE>
    <WARIANT_REALIS_SPEC>SELENA 6610 54/956 grey ADR                       </WARIANT_REALIS_SPEC>
    <ATTENTION />
  </WARIANT>
  <WARIANT>
    <WARIANT_CODE>Nogi</WARIANT_CODE>
    <WARIANT_SPEC>Nogi</WARIANT_SPEC>
    <WARIANT_REALIS_CODE>N034440</WARIANT_REALIS_CODE>
    <WARIANT_REALIS_SPEC>Nóżki drewniane 3B</WARIANT_REALIS_SPEC>
    <ATTENTION />
  </WARIANT>
</POSITION>

Mój kod Linq:

   var PlikXML = XDocument.Load(@NazwaPliku);

           
                var ZamElementy = PlikXML.Descendants("POSITION").Select(x =>
                            new PozycjaZam
                            {
                                ARTICLE_NR = x.Element("ARTICLE_NR").Value, 
                                ARTICLE_CODE = x.Element("ARTICLE_CODE").Value,
                                ARTICLE_NAME1 = x.Element("ARTICLE_NAME1").Value,
                                WARIANTY = x.Element("WARIANT").Elements().Select(e => (string)e.Element("WARIANT_REALIS_CODE")).ToList()
                              
                            }).ToList();
                

Niestety kolumna WARIANTY zwraca System.Collections.Generic.List`1[System.String]

Jak przebudować zapytanie aby odczytać wszystkie elementy z wszystkich sekcji WARIANT?

Z góry dzięki za odpowiedź.

K.T.

0

Zamiast Select(e => (string)e.Element("WARIANT_REALIS_CODE")) daj po prostu Select(e=> e.Value)

0

Dziękuję za odpowiedź. Niestety pobiera tylko pierwszą wartość z powyższych 3 sekcji WARIANT:

<WARIANT>
  <WARIANT_CODE>KORPUS</WARIANT_CODE>
  <WARIANT_SPEC>KORPUS</WARIANT_SPEC>
  <WARIANT_REALIS_CODE>T1277577         </WARIANT_REALIS_CODE>
  <WARIANT_REALIS_SPEC>SHERGAR ASH ADR                                   </WARIANT_REALIS_SPEC>
  <ATTENTION />
</WARIANT>

Pozostałe dwie są pominięte.
Pytanie jak brakujące wartości odczytać ?

0

No co ty gadasz

  static void Main(string[] args)
        {

            var PlikXML = XDocument.Load("test.xml");

            var ZamElementy = PlikXML.Descendants("POSITION").Select(x =>
                        new
                        {
                            ARTICLE_NR = x.Element("ARTICLE_NR").Value,
                            ARTICLE_CODE = x.Element("ARTICLE_CODE").Value,
                            ARTICLE_NAME1 = x.Element("ARTICLE_NAME1").Value,
                            WARIANTY = x.Element("WARIANT").Elements().Select(e => e.Value).ToList()

                        }).ToList();
            
        }

screenshot-20170116212449.png

0

OK. Może źle się wyraziłem :/
Chciałbym uzyskać jakiś obiekt, w którym były wszystkie WARIANT, a nie pierwszy dla sekcji, czyli dla mojego przykładu (dla uproszczenia po przecinku kolumny, wiersze to rekordy):

KORPUS , KORPUS, T1277577  ,SHERGAR ASH ADR   
PODOZD, PODUSZKI OZDOBNE , T13144423 ,SELENA 6610 54/956 grey ADR  
Nogi ,Nogi, N034440, Nóżki drewniane 3B

Nie mam pomysłu jak w ramach obiektu zbudować w Linq subquery, które zbierze dla danej sekcji <POSITION> elementy z wszystkich sekcji <WARIANT> (najczęściej są 3, ale bywają 2)

2
internal class Program
{
    private static void Main(string[] args)
    {
        var xDoc = XDocument.Load("XMLFile.xml");
        var position = xDoc.Descendants("POSITION")
                           .Select(pos => new
                                {
                                    ARTICLE_NR = pos.Element("ARTICLE_NR").Value,
                                    ARTICLE_CODE = pos.Element("ARTICLE_CODE").Value,
                                    ARTICLE_NAME1 = pos.Element("ARTICLE_NAME1").Value,
                                    WARIANTY = pos.Elements("WARIANT")
                                                .Select(x => x.Elements()
                                                                .Select(z => z.Value)
                                                                .ToList())
                                                .ToList()
                                })
                           .ToList();
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1