Электронная таблица GData и пространства имен GSX - PullRequest
0 голосов
/ 16 апреля 2011

Я пытаюсь читать Google Spreadsheet программно. К сожалению, я не могу использовать библиотеки GData, потому что платформа - Windows Phone.

После прочтения содержимого электронной таблицы с помощью API списков я получаю отдельные строки в виде XElements формы

<entry xmlns="http://www.w3.org/2005/Atom">
  <id>https://spreadsheets.google.com/feeds/list/0At7MazQVk6r1dHNOLS02MmVONDdLSDRNSjVPcUZRb0E/1/private/values/chk2m</id>
  <updated>2011-04-16T06:23:48.922Z</updated>
  <category scheme="http://schemas.google.com/spreadsheets/2006" term="http://schemas.google.com/spreadsheets/2006#list" />
  <title type="text">0002</title>
  <content type="text">ssname: Some random address, latitude: 2.8595084738555, longtitude: 167.0312830513769, fuel: x, maintenance_2: x</content>
  <link rel="self" type="application/atom+xml" href="https://spreadsheets.google.com/feeds/list/0At7MazQVk6r1dHNOLS02MmVONDdLSDRNSjVPcUZRb0E/1/private/values/chk2m" />
  <gsx:stationid xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">PK0002</gsx:stationid>
  <gsx:ssname xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">Svs Stn</gsx:ssname>
  <gsx:address xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">Some random address</gsx:address>
  <gsx:tel xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">12345678</gsx:tel>
  <gsx:latitude xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">1.35</gsx:latitude>
  <gsx:longtitude xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">103.80312830513769</gsx:longtitude>
  <gsx:operatinghours xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended"></gsx:operatinghours>
  <gsx:fuel xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">x</gsx:fuel>
  <gsx:fuel_2 xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended"></gsx:fuel_2>
  <gsx:maintenance xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended"></gsx:maintenance>
  <gsx:maintenance_2 xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">x</gsx:maintenance_2>
  <gsx:amenities xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended"></gsx:amenities>
  <gsx:amenities_2 xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended"></gsx:amenities_2>
</entry>

Меня интересуют только элементы, начинающиеся с пространства имен. Поэтому я объявил пространство имен таким образом и проверил каждого потомка, соответствует ли оно ему.

XNamespace gsx = "http://schemas.google.com/spreadsheets/2006/extended";
            IEnumerable<XElement> allItems = xe.Descendants();
            foreach (XElement xItem in allItems)
            {
                if (xItem.Name.NamespaceName == gsx.NamespaceName)
                {
                    Debug.WriteLine("$$$" + xItem);
                }
                else
                {
                    Debug.WriteLine("XXX" + xItem);
                }
            }

Я уверен, что есть элегантный способ, указав этот фильтр в качестве параметра XName для метода xe.Descendants (). Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 16 апреля 2011

xe.Elements().Where(el => el.Name.Namespace == gsx) должен предоставить вам все дочерние элементы xe, которые находятся в определенном вами пространстве имен gsx. Так что это возможно, вместо того, чтобы помещать оператор if в цикл foreach, вы можете просто отфильтровать элементы (или потомки, если необходимо) с помощью вызова метода Where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...