2017-06-06 7 views
0

Ich empfange XML in einer Struktur, die ich nicht kontrollieren kann, und versuche, das XML mit C# zu deserialisieren. Das XML enthält mehrere Namespaces. Der größte Teil des XML befindet sich in einem Namespace, aber ein Teil enthält ein Attribut in einem anderen Namespace. Mein Problem ist, dass der Inhaltsknoten immer als null dekodiert wird. Was muss ich tun, um dies zu korrigieren?XML-Deserialisierung mit C#, das Element mit einem Attribut in einem anderen Namespace enthält

Mein XML ist unten angegeben.

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

Die Klasse, die ich verwende, um das XML zu deserialisieren, wird ebenfalls bereitgestellt.

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

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

Antwort

1

Da das Content Element selbst nicht in einem anderen Namensraum als seine Mutter ist (nur das type Attribut ist), entfernen Sie das Namespace Attribut aus der Content Eigenschaft. Stattdessen müssen Sie RPSDocuments mit

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

bearbeiten schmücken: Sie auch DocumentContentData mit

[XmlType("CRCMinute")] 

Sie brauchen nicht die Serializable Attribute dekorieren müssen.

+0

Danke Rafal - Das war eine große Hilfe !! Ich konnte nicht herausfinden, was ich mit diesem Typ anfangen sollte. –

Verwandte Themen