Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > LINQ to XML


Автор: Artemon 29.4.2011, 14:01
Есть простой XML:

Код

  <Sync>
    <SyncAdd>
      <Tables>
        <Table Name="GeneralServiceNames">          
        </Table>
        <Table Name="test">
        </Table>
      </Tables>
    </SyncAdd>
    <SyncDelete>
    </SyncDelete>
  </Sync>


Хочу выбрать все имена таблиц, находящиеся в разделе SyncAdd:

Код

var queryTables = from s in xElement.Descendants("SyncAdd").Descendants("Tables")
                              select new
                              {
                                  TableName = (string)s.Element("Table").Attribute("Name")
                              };


Но почему-то всегда возвращается имя только одной таблицы: "GeneralServiceNames"

Автор: KelTron 29.4.2011, 14:22
Код

var queryTables = xElement
                .Element("SyncAdd")
                .Element("Tables")
                .Elements("Table")
                .Select(s => (string)s.Attribute("Name"));

Автор: Artemon 29.4.2011, 14:34
KelTron,  да действительно работает ваше решение.

А могули я как-то выбрать не одно поле а два и чтобы второе поле было типа XElement.

Код

            var queryTables = from s in xElement.Descendants("SyncAdd").Descendants("Tables")
                              select new
                              {
                                  Tables = (XElement)s.Element("Table"),
                                  TableName = (string)s.Element("Table").Attribute("Name")
                              };


Мой старый код мог это делать, но проблема все таже (выбирается только один элемент).
Попробовал ваш код приспособить:

Код

var queryTables = xElement
                .Element("SyncAdd")
                .Element("Tables")
                .Elements("Table")
                .Select( s => (XElement)s.Element("Table") );


Но почему-то выборка содержит 2 элемента со значением null, как-то можно исправить ?

Автор: Artemon 29.4.2011, 14:55
Разобрался, вот код:

Код

var queryTables = from s in xElement.Element("SyncAdd").Element("Tables").Elements("Table")
                              select new
                              {
                                  Tables = (XElement)s,
                                  TableName = (string)s.Attribute("Name")
                              };



KelTron, +1

Вопрос в догонку, чем отличается  xElement.Element("SyncAdd") от xElement.Descendants("SyncAdd")

Автор: KelTron 30.4.2011, 09:07
Цитата(Artemon @  29.4.2011,  19:34 Найти цитируемый пост)
Мой старый код мог это делать, но проблема все таже (выбирается только один элемент).

Всё аналогично:
Код

var queryTables = xElement
                .Element("SyncAdd")
                .Element("Tables")
                .Elements("Table")
                .Select(s => new
                {
                    Tables = (XElement)s,
                    TableName = (string)s.Attribute("Name")
                 });


Цитата(Artemon @  29.4.2011,  19:55 Найти цитируемый пост)
Вопрос в догонку, чем отличается  xElement.Element("SyncAdd") от xElement.Descendants("SyncAdd")

Element ищет объект в подэлементах xElement 1 уровня (в данном случае он только один - Tables), а Descendants ищет элемент вообще во всех подэлементах xElement - всё что вложено в теги <SyncAdd></SyncAdd>
http://msdn.microsoft.com/ru-ru/library/system.xml.linq.xcontainer.element.aspx
http://msdn.microsoft.com/ru-ru/library/bb353813.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)