【问题标题】:How to change the output of an XML in WCF如何在 WCF 中更改 XML 的输出
【发布时间】:2018-04-20 20:33:38
【问题描述】:

我定义了这些类:

 [DataContract(Name = "cardTemplateDefinition", Namespace = "")]
    public class CardTemplateDefinition
    {
      [DataMember(IsRequired = false, Name = "riskInfoList")]
        public RiskInfoList RiskInfoList { get; set; }
    }

    [DataContract(Namespace = "")]
    public class RiskInfoList
    {
        [DataMember(IsRequired = false, Name = "riskCount")]
        public string RiskCount { get; set; }

        [DataMember(IsRequired = false, Name = "riskInfo")]
        public List<RiskInfo> RiskInfo { get; set; }
    }

    [DataContract(Namespace = "")]
    public class RiskInfo
    {
        [DataMember(IsRequired = false, Name = "riskType")]
        public string RiskType { get; set; }

        [DataMember(IsRequired = false, Name = "riskDescription")]
        public string RiskDescription { get; set; }

        [DataMember(IsRequired = false, Name = "autoRisk")]
        public AutoRiskEntity AutoRisk { get; set; }

        [DataMember(IsRequired = false, Name = "dwellingRisk")]
        public DwellingRiskEntity DwellingRisk { get; set; }
    }

    [DataContract(Namespace = "")]
    public class DwellingRiskEntity
    {
        [DataMember(IsRequired = false, Name = "location")]
        public string Location { get; set; }
    }

    [DataContract(Namespace = "")]
    public class AutoRiskEntity
    {
        [DataMember(IsRequired = false, Name = "vin")]
        public string Vin { get; set; }

        [DataMember(IsRequired = false, Name = "make")]
        public string Make { get; set; }

        [DataMember(IsRequired = false, Name = "model")]
        public string Model { get; set; }

        [DataMember(IsRequired = false, Name = "licensePlate")]
        public string LicensePlate { get; set; }

        [DataMember(IsRequired = false, Name = "year")]
        public string Year { get; set; }
    }

这将创建以下 XML

<riskInfoList>
   <riskCount></riskCount>
   <riskInfo>
      <!--Zero or more repetitions:-->
      <riskInfo>
         <autoRisk>
            <licensePlate>?</licensePlate>
             <make>?</make>
            <model>?</model>
            <vin>?</vin>
            <year>?</year>
         </autoRisk>
         <dwellingRisk>
            <location>?</location>
         </dwellingRisk>
         <riskDescription>?</riskDescription>
         <riskType>?</riskType>
      </riskInfo>
   </riskInfo>
</riskInfoList>

但我想要的是:

  <riskInfoList>
     <riskCount>?</riskCount>
          <!--Zero or more repetitions:-->
          <riskInfo>
             <autoRisk>
                <licensePlate>?</licensePlate>
                 <make>?</make>
                <model>?</model>
                <vin>?</vin>
                <year>?</year>
             </autoRisk>
             <dwellingRisk>
                <location>?</location>
             </dwellingRisk>
             <riskDescription>?</riskDescription>
             <riskType>?</riskType>
          </riskInfo>
    </riskInfoList>

我想摆脱 riskInfo 重复根。我试图通过消除RiskInfoList 类来更改字段定义,并将carddefinition 类中的RiskInfoList 字段直接更改为RiskInfo 列表。这按照我的意愿呈现了 xml,但是我不能包含 riskCount 元素,因为它需要处于 riskinfolist 级别。

我该如何补救?

【问题讨论】:

标签: c# xml wcf serialization


【解决方案1】:

DataContractSerializer 不支持您想要做的事情,但您可以切换到使用XmlSerializer 并获得您想要的结果:

首先,更新您的 ServiceContract 使其也具有 XmlSerializerFormat 属性:

[ServiceContract, XmlSerializerFormat]
public interface IService1
{
    [OperationContract]
    CardTemplateDefinition SomeMethod(CardTemplateDefinition composite);

}

然后从您的模型类中删除 [DataContract] 属性,并将 [DataContract] 属性更改为 [XmlElement] 属性:

public class CardTemplateDefinition
{
    [XmlElement("riskInfoList")]      
    public RiskInfoList RiskInfoList { get; set; }
}

public class RiskInfoList 
{
    [XmlElement("riskCount")]
    public string RiskCount { get; set; }

    [XmlElement("riskInfo")]
    public List<RiskInfo> RiskInfo { get; set; }
}

public class RiskInfo
{
    [XmlElement("riskType")]
    public string RiskType { get; set; }

    [XmlElement("riskDescription")]
    public string RiskDescription { get; set; }

    [XmlElement("autoRisk")]
    public AutoRiskEntity AutoRisk { get; set; }

    [XmlElement("dwellingRisk")]
    public DwellingRiskEntity DwellingRisk { get; set; }
}


public class DwellingRiskEntity
{
    [XmlElement("location")]        
    public string Location { get; set; }
}

public class AutoRiskEntity
{
    [XmlElement("vin")]
    public string Vin { get; set; }

    [XmlElement("make")]
    public string Make { get; set; }

    [XmlElement("model")]
    public string Model { get; set; }

    [XmlElement("licensePlate")]
    public string LicensePlate { get; set; }

    [XmlElement("year")]
    public string Year { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2022-12-17
    相关资源
    最近更新 更多