2017-06-06 8 views
0

私は制御できない構造でXMLを受け取り、C#を使用してXMLを逆シリアル化しようとしています。 XMLには複数の名前空間が含まれています。ほとんどのXMLは1つの名前空間にありますが、異なる名前空間に属性を持つ部分があります。私の問題は、コンテンツノードが常にnullとしてデシリアライズされていることです。これを修正するには何が必要ですか?異なる名前空間に属性を持つ要素を含むC#を使用してXMLを逆シリアル化します。

私のXMLを以下に示します。

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

XMLを逆シリアル化するために使用しているクラスも提供されています。

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

RPSDocumentsを変更してください:[XmlRoot(ElementName = "Documents"、Namespace = "http://mycompany.com/api/v2")] – jdweng

答えて

1

Content要素自体は、その親とは別の名前空間ではないので(のみtype属性である)、ContentプロパティからNamespace属性を削除します。代わりに、あなたは

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

編集でRPSDocumentsを飾る必要があります。また、あなたはSerializable属性は必要ありません

[XmlType("CRCMinute")] 

DocumentContentDataを飾るする必要があります。

+0

Rafalに感謝します。私はそのタイプで何をすべきか分かりませんでした。 –

関連する問題