2010-11-26 9 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 

含まれると、単純な管理対象要素からシリアライズ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> 

ビルトインビジュアルスタジオのXML検証では、「これは無効なxsi:type 'http://www.3gpp.org/ftp/specs/archive/32_series/32.765#eutranNrm:ENBFunction」と記載されています。

シリアル化されたXMLが間違っているか、検証されていますか?別の名前空間とは何か関係ありますか?

XMLをデシリアライズすることはできますが、生成された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シリアライザを手に入れて幸いです。 LINQ to XMLを使用したり、せいぜいあなたの厄介なクラスのいくつかに 'IXmlSerializable'を実装し、それらを手作業で処理する方が良いかもしれません。 –

+0

私は自分の選択肢を検討していますが、すぐに何かを得るために。私はxsiに関連するエラーについてちょっと混乱しています:正直言ってタイプ - これは間違って使用されたXMLです(それは私には有効です)? – zeroid

答えて

2

私は手動でXSDから生成されたコードを編集することによって、これを解決しました。

[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 { 
... 

この属性は正しいが、シリアル化時に使用されていることを確認するために管理対象要素から継承されたすべてのクラスのために必要とされていますXmlElementAttributeは直列化が正しく動作することを確認するために管理対象要素のクラスのItemsコレクションに必要とされています。

関連する問題