Я сгенерировал некоторые классы C # из некоторых XSD 3GPP (несколько файлов XSD / пространств имен), и он отлично работает для сериализации, за исключением одной проблемы с конкретными экземплярами абстрактного типа, используемого в группе подстановки.
Во-первых, соответствующие части схемы:
(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, сериализованный из простого ManagedElement с содержащейся функцией ENBF:
<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>
Можно ли заставить сериализатор выводить его таким образом?
Спасибо за внимание ...