XML, сериализованный из xsd.exe, сгенерированный с использованием групп подстановки, недопустим (недопустимый xsi: ошибка типа) - PullRequest
2 голосов
/ 26 ноября 2010

Я сгенерировал некоторые классы 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>

Можно ли заставить сериализатор выводить его таким образом?

Спасибо за внимание ...

1 Ответ

2 голосов
/ 02 августа 2011

Я решил эту проблему, вручную отредактировав код, сгенерированный из XSD.Атрибут XmlElementAttribute необходим для коллекции элементов классов 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 {
...

Этот атрибут необходим для всех классов, унаследованных от ManagedElement, чтобы обеспечить использование правильного во время сериализации.

...