Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LINQ to XML 
V
    Опции темы
Artemon
Дата 29.4.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Есть простой 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"


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
KelTron
Дата 29.4.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Код

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



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Artemon
Дата 29.4.2011, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



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, как-то можно исправить ?


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Artemon
Дата 29.4.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Разобрался, вот код:

Код

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")


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
KelTron
Дата 30.4.2011, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Цитата(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/sy...er.element.aspx
http://msdn.microsoft.com/ru-ru/library/bb353813.aspx


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.7059 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.