Выбранные элементы XML для DataGrid с использованием LINQ в C #

У меня есть ответ XML от службы REST. Я попытался показать, как он имеет глубокую структуру элементов. Как вы видите, у XML есть дочерние элементы с тем же именем.

<list>
<message/>
<message/>
<message/>
<message>
    <messageId>3</messageId>
    <serverId>f5890d03-0bef-4704-a9de-9a1be64801c0</serverId>
    <channelId>ffffffff-3656-4b6f-8fd1-253e99177b80</channelId>
    <receivedDate>
        <time>1509259172350</time>
        <timezone>GMT+03:00</timezone>
    </receivedDate>
    <processed>true</processed>
    <connectorMessages class="linked-hash-map">
        <entry>
            <int>0</int>
            <connectorMessage>
                <messageId>3</messageId>
                <metaDataId>0</metaDataId>
                <channelId>ffffffff-3656-4b6f-8fd1-253e99177b80</channelId>
                <raw>
                    <encrypted>false</encrypted>
                    <channelId>ffffffff-3656-4b6f-8fd1-253e99177b80</channelId>
                    <messageId>3</messageId>
                    <metaDataId>0</metaDataId>
                    <contentType>RAW</contentType>
                </raw>
                <response>
                    <encrypted>false</encrypted>
                    <channelId>ffffffff-3656-4b6f-8fd1-253e99177b80</channelId>
                    <messageId>3</messageId>
                    <metaDataId>0</metaDataId>
                </response>
                <sourceMapContent>
                    <encrypted>false</encrypted>
                    <content class="java.util.Collections$UnmodifiableMap">
                        <m>
                            <entry>
                                <string>remoteAddress</string>
                                <string>127.0.0.1</string>
                            </entry>
                            <entry>
                                <string>destinationSet</string>
                                <linked-hash-set>
                                    <int>1</int>
                                </linked-hash-set>
                            </entry>
                        </m>
                    </content>
                </sourceMapContent>
                <connectorMapContent>
                    <encrypted>false</encrypted>
                    <content class="map">
                        <entry>
                            <string>_source</string>
                            <string>Instance1</string>
                        </entry>
                        <entry>
                            <string>_version</string>
                            <string>2.5.1</string>
                        </entry>
                    </content>
                </connectorMapContent>
                <encrypted>false</encrypted>
                <errorCode>0</errorCode>
            </connectorMessage>
        </entry>
    </connectorMessages>
</message>
<message/>
</list>

Я так новичок в C # и C # XML-процессе. Я провел выходные, чтобы найти способ привязать его к DataGridView. Я хочу использовать только 20 элементов из этого XML-ответа для моего DataGridView.

Я попытался использовать DataTable / DataSet для этой привязки, но я не смог получить дочерние элементы с таким же именем. Он принимает первый соответствующий элемент.

var table = new DataTable("message");
table.Columns.Add("messageId", typeof(string));
table.Columns.Add("serverId", typeof(string));
table.Columns.Add("time", typeof(string));
table.Columns.Add("receivedDate", typeof(string));
table.Columns.Add("timezone", typeof(string));
table.ReadXml(new StringReader(contentSystemInfo));
dataGridView1.DataSource = table;

Чем я пытался с LINQ;

XDocument xmlDocument = XDocument.Parse(contentSystemInfo);
List<string> messageRAWContentList = xmlDocument.Root
    .Elements("message")
    .Elements("connectorMessages")
    .Elements("entry")
    .Elements("connectorMessage")
    .Elements("raw")
    .Elements("content")
    .Select(x => (string)x)
    .ToList();

Все еще не удалось достичь дочерних элементов.

В примере я хочу достичь этого элемента в каждом элементе сообщения;

<list>
<message>
    <messageId>3</messageId>
    <serverId>f5890d03-0bef-4704-a9de-9a1be64801c0</serverId>
    <receivedDate>
        <time>1509259172350</time>
    </receivedDate>
    <connectorMessages class="linked-hash-map">
        <entry>
            <messageId>13</messageId>
            <connectorMessage>
                <raw>
                    <content>content</content>
                </raw>
                <response>
                    <content>content</content>
                </response>
                <sourceMapContent>
                    <content>
                        <m>
                            <entry>
                                <string>remoteAddress</string>
                                <string>127.0.0.1</string>
                            </entry>
                            <entry>
                                <string>destinationSet</string>
                                <linked-hash-set>
                                    <int>1</int>
                                </linked-hash-set>
                            </entry>
                        </m>
                    </content>
                </sourceMapContent>
            </connectorMessage>
        </entry>
    </connectorMessages>
</message>
</list>

c#,xml,linq,datagridview,datatable,

0

Ответов: 1


1 принят

Посмотрите, работает ли это:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:    emp     est.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            var results = doc.Descendants("message").Select(x => new {
                messageId = (int)x.Element("messageId"),
                serverId = (string)x.Element("serverId"),
                channelId = (string)x.Element("channelId"),
                time = (long)x.Descendants("time").FirstOrDefault(),
                connectorMessages = x.Descendants("connectorMessage").Select(y => new {
                    messageId = (int)y.Descendants("messageId").FirstOrDefault(),
                    raw = y.Elements("raw").Select(z => new {
                        encrypted = (bool)z.Element("encrypted"),
                        channelId = (string)z.Element("channelId"),
                        messagedId = (int)z.Element("messageId"),
                        metaDataId = (string)z.Element("metaDataId"),
                        contentType = (string)z.Element("contentType")
                    }).FirstOrDefault(),
                    response = y.Elements("response").Select(z => new {
                        encrypted = (bool)z.Element("encrypted"),
                        channelId = (string)z.Element("channelId"),
                        messagedId = (int)z.Element("messageId"),
                        metaDataId = (string)z.Element("metaDataId")
                    }).FirstOrDefault(),
                    entries = y.Descendants("entry").Select(z => new {
                            strings = z.Elements("string").Select(b => (string)b).ToList()
                    }).ToList()
                }).ToList()
            }).ToList();


        }
    }
}
C #, XML, LINQ, DataGridView, DataTable,
Похожие вопросы
Яндекс.Метрика