2011-10-06 146 views
2

我从大量XSD生成> 100个类,以构建用于内部测试的测试用例应用程序。我正在使用XSD.exe来生成这些类,因为这样做会带来太多风险,并且会花费太长时间。将枚举序列化为XML属性

我遇到了一个令我有点痛的问题。我试图得到这个枚举(现在只是这一个,然后我会对其余的做相同的技术...)

我想这是为了产生这样的事情(其中接收器元件具有TYPECODE属性):

<receiver typeCode="RCV"> 
    <device classCode="DEV" determinerCode="INSTANCE"> 
     <id root="..." extension="..." /> 
     <asAgent classCode="AGNT"> 
      <representedOrganization classCode="ORG" determinerCode="INSTANCE"> 
       <id root="..." extension="..." /> 
      </representedOrganization> 
     </asAgent> 
    </device> 
</receiver> 

然而,接收器从来没有得到一个属性,即使我已经在测试工具启动对象explicetly设置:

this.receiver = new MCCI_MT000100BCReceiver(); 
    this.receiver.typeCode = CommunicationFunctionType.RSP; 
    this.receiver.device = new MCCI_MT000100BCDevice(); 

我有一个枚举(I”我添加了XMLEnums和[Flags]属性,因为XSD.exe没有打扰)

[Flags] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] 
[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:hl7-org:v3")] 
public enum CommunicationFunctionType 
{ 

    /// <remarks/> 
    [System.Xml.Serialization.XmlEnum("RCV")] 
    RCV = 1, 

    /// <remarks/> 
    [System.Xml.Serialization.XmlEnum("RSP")] 
    RSP = 2, 

    /// <remarks/> 
    [System.Xml.Serialization.XmlEnum("SND")] 
    SND = 3, 
} 

这是使用枚举类之一:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(TypeName = "MCCI_MT000100BC.Receiver", Namespace = "urn:hl7-org:v3")] 
    public partial class MCCI_MT000100BCReceiver 
    { 

     private CS[] realmCodeField; 

     private II typeIdField; 

     private II[] templateIdField; 

     private MCCI_MT000100BCDevice deviceField; 

     private CommunicationFunctionType typeCodeField; 

     private bool typeCodeFieldSpecified; 

     public MCCI_MT000100BCReceiver() 
     { 
      this.typeCodeField = CommunicationFunctionType.RCV; 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute("realmCode")] 
     public CS[] realmCode 
     { 
      get 
      { 
       return this.realmCodeField; 
      } 
      set 
      { 
       this.realmCodeField = value; 
      } 
     } 

     /// <remarks/> 
     public II typeId 
     { 
      get 
      { 
       return this.typeIdField; 
      } 
      set 
      { 
       this.typeIdField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute("templateId")] 
     public II[] templateId 
     { 
      get 
      { 
       return this.templateIdField; 
      } 
      set 
      { 
       this.templateIdField = value; 
      } 
     } 

     /// <remarks/> 
     public MCCI_MT000100BCDevice device 
     { 
      get 
      { 
       return this.deviceField; 
      } 
      set 
      { 
       this.deviceField = value; 
      } 
     } 

     /// <remarks/> 

     [System.Xml.Serialization.XmlAttributeAttribute()] 
     public CommunicationFunctionType typeCode 
     { 
      get 
      { 
       return this.typeCodeField; 
      } 
      set 
      { 
       this.typeCodeField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlIgnoreAttribute()] 
     public bool typeCodeSpecified 
     { 
      get 
      { 
       return this.typeCodeFieldSpecified; 
      } 
      set 
      { 
       this.typeCodeFieldSpecified = value; 
      } 
     } 
    } 

据我所知,序列化枚举是不是.NET喜欢在时间做,但任何帮助,将不胜感激。

+0

枚举是否在xsd中定义? –

+0

@Jayanta - 是的,它被定义。我大概有100个,而XSD只占90%以上,因为它不喜欢多个有限制的嵌套工会。 –

回答

4

.net/XML中的枚举没有问题;问题很简单,你(或xsd)添加了“typeCodeSpecified”成员。这是模式,用于有条件地包含值 - 具体而言,对于名为“Foo”的成员,引擎检查“FooSpecified”属性或“ShouldSerializeFoo()”方法。由于您从未将“typeCodeSpecified”设置为true,它将返回false,并且在序列化过程中将省略该成员。

如果你不想那样,删除此成员。

+0

你100%正确。 TypeCodeSpecified - 这是XSD.exe添加的内容。但是,我对于如何影响TypeCode属性有点遗憾。 –

+1

@Ryan我试图解释这一点; p它只是一个基于名称的模式。如果你有*一个名为“typeCode”的属性和一个名为“typeCodeSpecified”的属性,那么**通过名称**,“typeCodeSpecified”的目的是控制是否将“typeCode”写入输出。如果在输入中找到“typeCode”,它在反序列化期间也会被设置为“true”。这只是'XmlSerializer'的行为,它会查找这些模式。 –

+0

非常感谢。再次阅读并玩我所设想的代码。再次感谢你为我教授新的东西! :) –