XML-десериализация Google Picasa API - PullRequest
1 голос
/ 01 сентября 2011

В настоящее время я работаю с Google Picasa API, пытаясь составить список альбомов. Код для OAuth 2.0 написан и работает. Я могу получить список альбомов XML без каких-либо проблем. В прошлом я очень мало работал с XML и не могу заставить его десериализоваться.

Я пытался использовать инструмент XSD.exe для создания .xsd, а затем классов из него, но сразу получаю ошибку: столбец с именем 'id' уже принадлежит этому объекту DataTable.

Я не могу понять почему, потому что второй тег ID вложен в другой узел. Кто-нибудь может направить меня в правильном направлении?

XML:

<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
    xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/'
    xmlns:exif='http://schemas.google.com/photos/exif/2007'
    xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'
    xmlns:gml='http://www.opengis.net/gml'
    xmlns:georss='http://www.georss.org/georss'
    xmlns:batch='http://schemas.google.com/gdata/batch'
    xmlns:media='http://search.yahoo.com/mrss/'
    xmlns:gphoto='http://schemas.google.com/photos/2007'
    xmlns:gd='http://schemas.google.com/g/2005'
    gd:etag='W/"CkABRXY8fip7ImA9WxVVGE8."'>
  <id>https://picasaweb.google.com/data/feed/api/user/liz</id>
  <updated>2009-03-12T01:19:14.876Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/photos/2007#user' />
  <title>liz</title>
  <subtitle></subtitle>
  <icon>https://iconPath/liz.jpg</icon>
  <link rel='http://schemas.google.com/g/2005#feed'
    type='application/atom+xml'
    href='https://picasaweb.google.com/data/feed/api/user/liz' />
  <link rel='http://schemas.google.com/g/2005#post'
    type='application/atom+xml'
    href='https://picasaweb.google.com/data/feed/api/user/liz' />
  <link rel='alternate' type='text/html'
    href='http://picasaweb.google.com/liz' />
  <link rel='http://schemas.google.com/photos/2007#slideshow'
    type='application/x-shockwave-flash'
    href='http://picasaweb.google.com/s/c/bin/slideshow.swf?host=picasaweb.google.com&amp;RGB=0x000000&amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fliz%3Falt%3Drss' />
  <link rel='self' type='application/atom+xml'
    href='https://picasaweb.google.com/data/feed/api/user/liz?start-index=1&amp;max-results=1000&amp;v=2' />
  <author>
    <name>Liz</name>
    <uri>http://picasaweb.google.com/liz</uri>
  </author>
  <generator version='1.00' uri='http://picasaweb.google.com/'>
    Picasaweb</generator>
  <openSearch:totalResults>1</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>1000</openSearch:itemsPerPage>
  <gphoto:user>liz</gphoto:user>
  <gphoto:nickname>Liz</gphoto:nickname>
  <gphoto:thumbnail>
    https://thumbnailPath/liz.jpg</gphoto:thumbnail>
  <gphoto:quotalimit>1073741824</gphoto:quotalimit>
  <gphoto:quotacurrent>32716</gphoto:quotacurrent>
  <gphoto:maxPhotosPerAlbum>500</gphoto:maxPhotosPerAlbum>
  <entry gd:etag='"RXY8fjVSLyp7ImA9WxVVGE8KQAE."'>
    <id>https://picasaweb.google.com/data/entry/api/user/liz/albumid/albumID</id>
    <published>2005-06-17T07:09:42.000Z</published>
    <updated>2009-03-12T01:19:14.000Z</updated>
    <app:edited xmlns:app='http://www.w3.org/2007/app'>
      2009-03-12T01:19:14.000Z</app:edited>
    <category scheme='http://schemas.google.com/g/2005#kind'
      term='http://schemas.google.com/photos/2007#album' />
    <title>lolcats</title>
    <summary>Hilarious Felines</summary>
    <rights>public</rights>
    <link rel='http://schemas.google.com/g/2005#feed'
      type='application/atom+xml'
      href='https://picasaweb.google.com/data/feed/api/user/liz/albumid/albumID?authkey=authKey&amp;v=2' />
    <link rel='alternate' type='text/html'
      href='http://picasaweb.google.com/lh/album/aFDUU2eJpMHZ1dP5TGaYHxtMTjNZETYmyPJy0liipFm0?authkey=authKey' />
    <link rel='self' type='application/atom+xml'
      href='https://picasaweb.google.com/data/entry/api/user/liz/albumid/albumID?authkey=authKey&amp;v=2' />
    <link rel='edit' type='application/atom+xml'
      href='https://picasaweb.google.com/data/entry/api/user/liz/albumid/albumID/1236820754876000?authkey=authKey&amp;v=2' />
    <link rel='http://schemas.google.com/acl/2007#accessControlList'
      type='application/atom+xml'
      href='https://picasaweb.google.com/data/entry/api/user/liz/albumid/albumID/acl?authkey=authKey&amp;v=2' />
    <author>
      <name>Liz</name>
      <uri>http://picasaweb.google.com/liz</uri>
    </author>
    <gphoto:id>albumID</gphoto:id>
    <gphoto:location>Mountain View, CA</gphoto:location>
    <gphoto:access>public</gphoto:access>
    <gphoto:timestamp>1118992182000</gphoto:timestamp>
    <gphoto:numphotos>1</gphoto:numphotos>
    <gphoto:numphotosremaining>499</gphoto:numphotosremaining>
    <gphoto:bytesUsed>23044</gphoto:bytesUsed>
    <gphoto:user>liz</gphoto:user>
    <gphoto:nickname>Liz</gphoto:nickname>
    <media:group>
      <media:title type='plain'>lolcats</media:title>
      <media:description type='plain'>Hilarious
        Felines</media:description>
      <media:keywords></media:keywords>
      <media:content url='https://imagePath/Lolcats.jpg' type='image/jpeg' medium='image' />
      <media:thumbnail url='https://thumbnailPath/Lolcats.jpg' height='160' width='160' />
      <media:credit>Liz</media:credit>
    </media:group>
  </entry>
  ...more entries similar to the one above here...
</feed>

1 Ответ

2 голосов
/ 01 сентября 2011

Я не знаю, почему xsd.exe не работает. По моему опыту, полезно дать вам старт, но это небезопасно при создании оптимизированных классов C # для XML-документа, который вы хотите сериализовать. Есть другие инструменты Code-Gen, которые делают подобное. XsdObjectGen является бесплатным, не уверен, что он все еще существует.

В своем комментарии я сказал С другой стороны, довольно сложно вручную написать код для работы с сериализатором Xml.

Этот частичный пример должен помочь вам начать:

[XmlType("generator", Namespace="http://www.w3.org/2005/Atom")]
public partial class FeedGenerator
{
    [XmlAttribute]
    public string version { get; set; }
    [XmlAttribute]
    public string uri { get; set; }
    [XmlText]
    public string text { get; set; }
}

[XmlType("category", Namespace="http://www.w3.org/2005/Atom")]
public partial class FeedCategory
{
    [XmlAttribute]
    public string scheme { get; set; }
    [XmlAttribute]
    public string term { get; set; }
}

[XmlType("entry", Namespace="http://www.w3.org/2005/Atom")]
public partial class FeedEntry
{
    public FeedCategory category { get; set; }
    public string title { get; set; }
    public string summary { get; set; }
}

[XmlType("author", Namespace="http://www.w3.org/2005/Atom")]
public partial class FeedAuthor
{
    public string name { get; set; }
    public string uri { get; set; }
}

[XmlType("link", Namespace="http://www.w3.org/2005/Atom")]
public partial class FeedLink
{
    [XmlAttribute]
    public string rel { get; set; }
    [XmlAttribute]
    public string @type { get; set; }
    [XmlAttribute]
    public string href { get; set; }
}

[XmlType("feed", Namespace="http://www.w3.org/2005/Atom")]
[XmlRoot("feed", Namespace="http://www.w3.org/2005/Atom")]
public partial class FeedList
{
    public string id        { get;set; }
    public string title     { get;set; }
    public string icon      { get;set; }

    [XmlElement("link")]
    public FeedLink[] links      { get;set; }
    public FeedGenerator generator      { get;set; }

    [XmlElement(Namespace="http://a9.com/-/spec/opensearch/1.1/")]
    public int totalResults      { get;set; }

    [XmlElement("entry")]
    public FeedEntry[] entries { get; set; }
}

Этот код десериализует только те элементы в классе FeedList. Если вам нужны дополнительные элементы, добавьте их. Текстовый элемент можно десериализовать как свойство простого типа, например, string, int или DateTime. Сложный элемент должен быть свойством пользовательского класса, украшенного XmlType.

Для десериализации последовательности из нескольких элементов, таких как элементы link или entry, определите массив и украсьте его XmlElement, как показано. Значения внутри двойных кавычек являются именами элементов, используемых для каждого. Атрибуты в XML получают свойства, украшенные атрибутом XmlAttribute в коде C #, а значением в кавычках является имя attr. Отсутствие значения означает отображение атрибута в xml, имя которого совпадает с именем свойства, в данное свойство. (Свойство с именем «rel» в коде C #, украшенное XmlAttribute, сопоставляется со значением атрибута xml с именем «rel» в документе XML)

Если вам нужны элементы из другой схемы (например, схема opensearch и т. Д.), Вам необходимо указать свойства, соответствующие элементам из этой схемы. Опять же, используйте пользовательские классы для сложных типов в XML; простые типы данных C # для простых (только текстовых) элементов в XML. Для простого типа атрибут XmlElement в свойстве или, для сложного типа, атрибут XmlType в пользовательском классе должен указывать пространство имен xmlns для этого элемента. Вам не нужно беспокоиться о префиксе элемента - пространство имен - это то, что важно. См. Свойство totalResults в качестве примера.

Если в атрибуте XmlElement или XmlAttribute отсутствует немеченое строковое значение, имя элемента или имя атрибута считается именем самого свойства. Итак, в приведенном выше свойстве totalResults десериализует элемент openSearch:totalResults, потому что я предоставил xmlns, соответствующий openSearch.

Чтобы десериализовать текстовый узел элемента xml, используйте атрибут XmlText.

Расширьте приведенный выше пример, и вы сможете десериализовать все, что нужно для десериализации.


EDIT
Но вы можете использовать библиотеку, которая уже создана для этого.
http://code.google.com/p/google-gdata/updates/list

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