2013-10-27 3 views
2

Я пытаюсь десериализовать XMLNS-файл.C# XMLNS сложная десериализация

<feed xmlns:live="http://www.live.com/marketplace" xmlns="http://www.w3.org/2005/Atom"> 
    <live:totalItems>1177</live:totalItems> 
    <live:numItems>1</live:numItems> 
    <title>FindGames Results</title> 
    <updated>2013-09-19T09:28:02.77Z</updated> 
    <entry live:itemNum="34" live:detailView="3"> 
    <id>urn:uuid:66ACD000-77FE-1000-9115-D802555308C3</id> 
    <updated>2013-09-19T09:28:02.77Z</updated> 
    <title>Rayman® Legends</title> 
    <content type="text">game content</content> 
    <live:media> 
     <live:mediaType>1</live:mediaType> 
     <live:gameTitleMediaId>urn:uuid:66ACD000-77FE-1000-9115-D802555308C3</live:gameTitleMediaId> 
     <live:reducedTitle>Rayman® Legends</live:reducedTitle> 
     <live:reducedDescription>The Glade of Dreams is in trouble once again! During a 100-year nap, nightmares have multiplied and spread, creating new monsters even scarier than before!</live:reducedDescription> 
     <live:availabilityDate>2013-06-11T00:00:00</live:availabilityDate> 
     <live:releaseDate>2013-08-29T00:00:00</live:releaseDate> 
     <live:ratingId>20</live:ratingId> 
     <live:developer>Ubisoft</live:developer> 
     <live:publisher>Ubisoft</live:publisher> 
     <live:newestOfferStartDate>2013-09-13T09:00:00Z</live:newestOfferStartDate> 
     <live:totalOfferCount>1</live:totalOfferCount> 
     <live:titleId>1431505091</live:titleId> 
     <live:effectiveTitleId>1431505091</live:effectiveTitleId> 
     <live:gameReducedTitle>Rayman® Legends</live:gameReducedTitle> 
     <live:ratingAggregate>4.50</live:ratingAggregate> 
     <live:numberOfRatings>1193</live:numberOfRatings> 
    </live:media> 
    </entry> 
</feed> 

Мой текущий код: Deserialize класс:

[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")] 
public class entry 
{ 
    public string title { get; set; } 
    public string totalItems { get; set; } 
    public string reducedDescription{ get; set; } 
    public string ratingId { get; set; } 
    public string developer { get; set; } 
    public string publisher { get; set; } 
    public string tittleId { get; set; } 
    public string ratingAggregate { get; set; } 
    public string numberOfRatings { get; set; } 
    public string boxImage { get; set; } 
    public string categories { get; set; } 
} 

class deserializeXML 
{ 
    public static void deserialize() 
    { 
     using (StreamReader reader = new StreamReader("Query.xml")) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(entry)); 
      entry x1 = serializer.Deserialize(reader) as entry; 
     } 
    } 
} 

Я просто получать название (FindGames Результаты вместо Rayman® Легенд). Мне нужно получить параметры после «entry» и «live: media», я понятия не имею, как получить параметры с помощью «live:» в начале.

EDIT:

[XmlElement(Namespace = "http://www.live.com/marketplace")] 
public int numItems { get; set; } 
[XmlElement(Namespace = "http://www.live.com/marketplace")] 
public int totalItems { get; set; } 

Это хорошо работает, но:

[XmlElement("media" Namespace="http://www.live.com/marketplace")] 
    public media media{ get; set; } 

Это возвращение нулевой класс медиа:/

+0

Почему бы не перейти непосредственно к структуре XML? Почему бы не начать с класса «Feed», имея свойства TotalItems, NumItems, Title, Update и 'Entry'? –

ответ

2

Вы должны явно сопоставить эти типы и свойства, которые не в пространство имен атомов в их соответствующие пространства имен. Объявление пространства имен в XmlRoot просто указывает пространство имен корневого элемента. Если в документе есть несколько пространств имен, вы должны явно их вызывать.

Например, чтобы отобразить атрибут itemNum правильно попробовать это в вашем классе входа:

[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")] 
public class entry 
{ 
    [XmlAttribute("itemNum", Namespace = "http://www.live.com/marketplace")] 
    public int itemNum { get; set; } 

    public string title { get; set; } 
    public string totalItems { get; set; } 
    public string reducedDescription { get; set; } 
    public string ratingId { get; set; } 
    public string developer { get; set; } 
    public string publisher { get; set; } 
    public string tittleId { get; set; } 
    public string ratingAggregate { get; set; } 
    public string numberOfRatings { get; set; } 
    public string boxImage { get; set; } 
    public string categories { get; set; } 
} 

Затем нужно объявить дополнительный тип для отображения в такие вещи, как узел медиа.

class media 
{ 
    public int mediaType{ get; set; } 
    public string reducedDescription{ get; set; } 
etc. etc. 
} 

Затем нужно переместить все эти «живые» свойства из вашего класса входа в вас новый класс медиа оставив вас с классом входа, который может выглядеть следующим образом:

[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")] 
    public class entry 
    { 
     [XmlAttribute("itemNum", Namespace = "http://www.live.com/marketplace")] 
     public int itemNum { get; set; } 

     public string title { get; set; } 

     [XmlElement("media" Namespace="http://www.live.com/marketplace")] 
     public media media{ get; set; } 
    } 

Ваш класс иерархии не нужно точно соответствовать иерархии xml, и вы можете сделать некоторое значительное переназначение и преобразование Xml, используя различные атрибуты в System.Xml.Serialization, однако мне легче реализовать, понять и поддерживать подобные вещи, если классы C# карту 1: 1 на структуру xml.

+0

Thx, но можете ли вы просмотреть конец моего первого сообщения? –

+0

Я бы внимательно посмотрел, как вы сравниваете типы C# со структурой xml. На основе ваших фрагментов они действительно не соответствуют, поэтому было бы трудно сказать вам, что не так. У вас должна быть иерархия классов, которая выглядит точно так же, как иерархия xml. – dkackman

+0

@Adam, вы также должны взглянуть на этот ответ. Есть инструменты, которые требуют некоторых из ворчания из этого. http://stackoverflow.com/questions/4203540/generate-c-sharp-class-from-xml – dkackman

Смежные вопросы