いくつかの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>
は私が出力し、このようにシリアライザを強制することはできますか?
探してくれてありがとう...
このシンプルなものに対処するXMLシリアライザを手に入れて幸いです。 LINQ to XMLを使用したり、せいぜいあなたの厄介なクラスのいくつかに 'IXmlSerializable'を実装し、それらを手作業で処理する方が良いかもしれません。 –
私は自分の選択肢を検討していますが、すぐに何かを得るために。私はxsiに関連するエラーについてちょっと混乱しています:正直言ってタイプ - これは間違って使用されたXMLです(それは私には有効です)? – zeroid