Linq to XML

0

Witam,
mam takiego xml'a jak poniżej. Próbuje napisać zapytanie dzięki któremu mógłbym uzyskać takiego outputa:
12 10 11 5 01 1 AN 0454741
10 05 06 2 00 1 SW 0729103
26 05 04 2 01 1 G 0264443

Próbowałem zrobić to tak:

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

            var query = from c in xml.Descendants()
                // where (string)c.Attribute("name") == "WOJ"
                select new
                {
                    name1 = ((string)c.Attribute("name") == "name1")? c.Value : string.Empty,
                    name2 = ((string)c.Attribute("name") == "name2") ? c.Value : string.Empty,
                    name3 = ((string)c.Attribute("name") == "name3") ? c.Value : string.Empty
...
                };

            foreach (var item in query)
            {
                Console.WriteLine(item.name1 + " " + item.name2 + " " + item.name3 ...);
            }

ale nie działa:/ Moglibyście pomóc?

<?xml version="1.0" encoding="UTF-8"?>
<root>
<catalog name="test" type="all" date="2016-01-01">
<row>
<col name="name1">12</col>
<col name="name2">10</col>
<col name="name3">11</col>
<col name="name4">5</col>
<col name="name5">01</col>
<col name="name6">1</col>
<col name="name7">AN</col>
<col name="name8">0454741</col>
<col name="name9">0454741</col>
<col name="name10">2016-01-01</col>
</row>
<row>
<col name="name1">10</col>
<col name="name2">05</col>
<col name="name3">06</col>
<col name="name4">2</col>
<col name="name5">00</col>
<col name="name6">1</col>
<col name="name7">SW</col>
<col name="name8">0729103</col>
<col name="name9">0729095</col>
<col name="name10">2016-01-01</col>
</row>
<row>
<col name="name1">26</col>
<col name="name2">05</col>
<col name="name3">04</col>
<col name="name4">2</col>
<col name="name5">01</col>
<col name="name6">1</col>
<col name="name7">G</col>
<col name="name8">0264443</col>
<col name="name9">0264443</col>
<col name="name10">2016-01-01</col>
</row>
</catalog>
</root> 
0
            var xml = XDocument.Load(@"test.xml");
            foreach (var row in xml.Descendants("row"))
            {
                foreach (var col in row.Descendants("col").Take(8))
                {
                    Console.Write(col.Value + " ");
                }
                Console.WriteLine();
            } 
0

Dzięki, oczywiście działa, ale czy jest możliwość żebym mógł się odnosić bezpośrednio do tych pól, coś takiego jak próbowałem wyżej?

 name1 = ((string)c.Attribute("name") == "name1")? c.Value : string.Empty,
0

Możesz, ale nie wiem co dokładnie chcesz zrobić.
Mógłbym przypisać swój kod aby zamiast zagnieżdżonej pętli pobierać elementy po atrybucie ale to by było copy-paste.
Podejrzewam że nie pokazujesz prawdziwego xmla ani tego co chcesz tak naprawdę zrobić.

0

Będę potrzebował jeszcze złączyć pierwszych sześć kolumn w jeden kod i móc dopisać coś przed nim, np:

Kod:1210115011 Znacznik:AN KodP:0454741

2

Proszę:

             var xml = XDocument.Load(@"test.xml");
            foreach (var row in xml.Descendants("row"))
            {
                var firstSixCols = string.Join("", row.Descendants("col").Take(6).Select(x=> x.Value));
                var marker = row.Descendants("col").First(x => x.Attribute("name").Value == "name7").Value;
                var kodp = row.Descendants("col").First(x => x.Attribute("name").Value == "name8").Value;
                Console.WriteLine("Kod:{0} Znacznik:{1} KodP:{2}",firstSixCols,marker,kodp);
            }

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