2010-11-26 5 views
2

일부 3GPP XSD (여러 XSD 파일/네임 스페이스)에서 일부 C# 클래스를 생성했으며 하나의 클래스 대체 그룹에서 사용되는 추상 유형의 구체적인 인스턴스에 대한 문제점.xsd.exe에서 직렬화 된 XML이 대체 그룹을 사용하여 생성 된 코드가 유효하지 않습니다 (잘못된 xsi : 유형 오류)

첫째, 스키마의 관련 부분 :

(genericNrm.xsd가)

<element name="ManagedElement"> 
    <complexType> 
     <complexContent> 
     <extension base="xn:NrmClass"> 
      <sequence> 
      ... 
      <choice minOccurs="0" maxOccurs="unbounded"> 
       <element ref="xn:IRPAgent"/> 
       <element ref="xn:ManagedElementOptionallyContainedNrmClass"/> 
       <element ref="xn:VsDataContainer"/> 
      </choice> 
      </sequence> 
     </extension> 
     </complexContent> 
    </complexType> 
</element> 

<element 
    name="ManagedElementOptionallyContainedNrmClass" 
    type="xn:NrmClass" 
    abstract="true" 
/> 

이 (eutran.xsd)

<element name="ENBFunction" substitutionGroup="xn:ManagedElementOptionallyContainedNrmClass"> 
    <complexType> 
     <complexContent> 
     <extension base="xn:NrmClass"> 
      <sequence> 
      <element name="attributes" minOccurs="0"> 
       <complexType> 
       <all> 
        <element name="userLabel" type="string" minOccurs="0"/> 
... etc 

이 간단한 ManagedElement에서 직렬화 된 XML이 포함로 ENB 기능 :

<ManagedElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="1234" xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.625#genericNrm"> 
    <ManagedElementOptionallyContainedNrmClass xmlns:q1="http://www.3gpp.org/ftp/specs/archive/32_series/32.765#eutranNrm" xsi:type="q1:ENBFunction" id="1234"> 
     <q1:attributes> 
     <q1:userLabel>label</q1:userLabel> 
     </q1:attributes> 
    </ManagedElementOptionallyContainedNrmClass> 
    </ManagedElement> 

내장 된 Visual Studio XML 유효성 검사에서 "This is invalid xsi : type 'http://www.3gpp.org/ftp/specs/archive/32_series/32.765#eutranNrm:ENBFunction'이라는 요소에 대해 불만을 토로합니다.

그래서 직렬화 된 XML이 잘못 되었습니까? 아니면 유효성 검사입니까? 별도의 네임 스페이스와 관련이 있습니까?

XML을 올바르게 deserialize 할 수 있지만 생성 된 XML이 스키마를 변경하지 않고 스키마를 준수해야합니다. 내가 수동으로 다음에 XML을 변경하는 경우, 오류가 사라 발견 (나는 쉽게도 읽을 찾기) :

<ManagedElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="1234" xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.625#genericNrm"> 
    <q1:ENBFunction xmlns:q1="http://www.3gpp.org/ftp/specs/archive/32_series/32.765#eutranNrm" id="1234"> 
     <q1:attributes> 
     <q1:userLabel>label</q1:userLabel> 
     </q1:attributes> 
    </q1:ENBFunction> 
</ManagedElement> 

나는 출력이이 방법에 시리얼을 강제 할 수 있습니까? 보고에 대한

감사합니다 ...

+1

XML Serializer가이 복잡한 것을 처리하도록 해 주셔서 감사합니다. LINQ to XML을 사용하거나 자신 만의 귀찮은 클래스 중 일부가'IXmlSerializable'을 구현하고 "손으로"처리하는 것이 더 좋을 수도 있습니다. " –

+0

감사합니다. 내 옵션을 고려 중이나 압력을 받고 있습니다. 신속하게 뭔가를 얻을 수 있습니다. 나는 xsi와 관련된 오류에 대해 혼란 스럽다 : 솔직히 말해서 - 이것은 잘못 사용 된 XML이다 (그것은 나에게 유효 해 보인다)? – zeroid

답변

2

내가 수동으로 XSD에서 생성 된 코드를 편집하여이 문제를 해결했다. XmlElementAttribute가 직렬화를 보장하기 위해 ManagedElement 클래스의 Items 컬렉션에 필요한 것은 제대로 작동 : ManagedElement로부터 상속 한 모든 클래스는 올바른 직렬화시에 사용되는지 확인하는

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.3gpp.org/ftp/specs/archive/32_series/32.625#genericNrm")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.3gpp.org/ftp/specs/archive/32_series/32.625#genericNrm", IsNullable=false)] 
public partial class ManagedElement : NrmClass { 

... 

[System.Xml.Serialization.XmlElementAttribute("ENBFunction", typeof(ENBFunction), Namespace = "http://www.3gpp.org/ftp/specs/archive/32_series/32.765#eutranNrm")] 
public NrmClass[] Items { 
... 

이 속성이 필요합니다.