反序列化XML使用含有元素在不同的命名空间

问题描述:

我收到的XML结构中的我没有控制权和在尝试使用C#反序列化XML属性C#。 XML包含多个名称空间。大多数XML的是在1个命名空间,但是存在具有在不同的命名空间的属性的部分。我的问题是,内容节点总是被反序列化空。我需要做些什么来纠正这个问题?反序列化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 = “文档”,命名空间= “http://mycompany.com/api/v2”) – jdweng

由于Content元件本身是不是在不同的命名空间比其父(只有type属性是),删除从Content属性的属性Namespace。相反,你必须装饰RPSDocuments

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

编辑:您也需要装饰DocumentContentData

[XmlType("CRCMinute")] 

你不需要Serializable属性。

+0

感谢拉法尔 - 这是一个巨大的帮助!我无法弄清楚如何处理这种类型的事情。 –