2011-10-06 3 views
2

많은 XSD에서 100 개 이상의 클래스를 생성하여 내부 테스트 용 테스트 하네스 애플리케이션을 작성합니다. XSD.exe를 사용하여 이러한 클래스를 생성합니다. 너무 많은 위험을 초래하여 너무 오래 걸립니다.XML 속성에 대한 열거 형 직렬화

나는 약간의 고통을 초래하는 문제가 있습니다. 이 열거 형을 얻으려고합니다. (이제는이 하나만 남은 것들에 대해서도 똑같은 기술을 할 것입니다 ...)

나는 무엇을 만들고 싶습니까? 내가 열거 (I '를 가지고

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

:

<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 테스트 환경을 시작 객체로 설정 한 경우에도, 속성을 얻을 수 없습니다 : 수신기 요소는 형태 코드 속성)가 XSD.exe가 문제가되지 않았으므로 XMLEnums와 [Flags] 특성을 추가했습니다.

[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

고마워요. 다시 읽은 후 코드를 가지고 놀면서 나는 많은 것을 생각했다. 새로운 것을 가르쳐 주신데 대해 다시 한번 감사드립니다! :) –