2017-06-06 4 views
0

Je reçois du XML dans une structure sur laquelle je n'ai aucun contrôle et que je tente de désérialiser le XML en utilisant C#. Le XML contient plusieurs espaces de noms. La plus grande partie du XML se trouve dans un espace de noms, mais une partie possède un attribut dans un espace de noms différent. Mon problème est que le nœud Content est toujours désérialisé en tant que null. Que dois-je faire pour corriger cela?Deserialize xml utilisant un élément contenant C# avec un attribut dans un espace de noms différent

Mon XML est donné ci-dessous.

<Documents xmlns="http://mycompany.com/api/v2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Document> 
     <Id>100000</Id> 
     <Title>Document Title</Title> 
     <Locale>en-US</Locale> 
     <Status>Archived</Status> 
     <PublishDate>2016-06-01T16:40:00</PublishDate> 
     <PublishDateUTC>2016-06-01T21:40:00Z</PublishDateUTC> 
     <UpdateDateUTC>2016-06-01T21:40:00Z</UpdateDateUTC> 
     <Companies> 
      <Company> 
       <Id>1C000TX2343</Id> 
       <Name>Company Name</Name> 
       <Status>Public</Status> 
       <OperationStatus>N</OperationStatus> 
       <Country>USA</Country> 
      </Company> 
     </Companies> 
     <Content i:type="CRCMinute"> 
      <AssetClass>Corporate</AssetClass> 
      <CommitteeAlphaRating>BB+</CommitteeAlphaRating> 
      <CommitteeCreditTrend>Negative</CommitteeCreditTrend> 
      <CommitteeMeetingDate>2016-06-01T00:00:00</CommitteeMeetingDate> 
      <CreditWatch i:nil="true"/> 
      <RatingStatus i:nil="true"/> 
      <ShortTermRating i:nil="true"/> 
      <SignatureDate>2016-06-01T16:40:00</SignatureDate> 
      <SignatureText>Alfred Neumann</SignatureText> 
     </Content> 
    </Document> 
</Documents> 

La classe que j'utilise pour désérialiser le XML est également fournie.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Xml.Serialization; 

namespace Morningstar.CreditRatings.CorporateShortTerm 
{ 
[XmlRoot("Documents")] 
public class RPSDocuments 
{ 
    [XmlElement("Document")] 
    public List<DocumentData> DocumentData { get; set; } 
} 

[Serializable] 
public class DocumentData 
{ 
    [XmlElement] 
    public string Id { get; set; } 

    [XmlElement] 
    public string Title { get; set; } 

    [XmlElement] 
    public string PublishDate { get; set; } 

    [XmlElement] 
    public string PublishDateUTC { get; set; } 

    [XmlElement] 
    public string UpdateDateUTC { get; set; } 

    [XmlArray("Companies")] 
    [XmlArrayItem("Company")] 
    public List<CompanyData> Companies { get; set; } 

    [XmlElement("Content", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 
    public DocumentContentData Content { get; set; } 
} 

[Serializable] 
public class CompanyData 
{ 
    [XmlElement] 
    public string Id { get; set; } 

    public string Name { get; set; } 

    [XmlElement] 
    public string Status { get; set; } 

    [XmlElement] 
    public string OperationStatus { get; set; } 

    [XmlElement] 
    public string Country { get; set; } 
} 

[Serializable] 
public class DocumentContentData 
{ 
    [XmlElement] 
    public string Analyst { get; set; } 

    [XmlElement] 
    public string AssetClass { get; set; } 

    [XmlElement] 
    public string CommitteeAlphaRating { get; set; } 

    [XmlElement] 
    public string CommitteeCreditTrend { get; set; } 

    [XmlElement] 
    public string CommitteeMeetingDate { get; set; } 

    [XmlElement] 
    public string CreditWatch { get; set; } 

    [XmlElement] 
    public string RatingStatus { get; set; } 

    [XmlElement] 
    public string ShortTermRating { get; set; } 

    [XmlElement] 
    public string SignatureDate { get; set; } 

    [XmlElement] 
    public string SignatureText { get; set; } 
} 

}

+0

Modifier RPSDocuments: [XmlRoot (ElementName = "Documents", Namespace = "http://mycompany.com/api/v2")] – jdweng

Répondre

1

Depuis l'élément Content est lui-même pas dans un espace de noms différent de celui de son parent (uniquement l'attribut type est), supprimez l'attribut Namespace de la propriété Content. Au lieu de cela, vous devez décorer RPSDocuments avec

[Namespace = "http://mycompany.com/api/v2"] 

Edit: Vous devez également décorer DocumentContentData avec

[XmlType("CRCMinute")] 

Vous n'avez pas besoin des attributs Serializable.

+0

Merci Rafal - Ce fut une aide énorme !! Je ne pouvais pas savoir quoi faire avec ce type. –