Полиморфный тип названий элементов с использованием XmlInclude ..? - PullRequest
3 голосов
/ 18 августа 2010

Я хочу создать структуру вроде:

<root>
 <items>
  <myns:a s="a"/>
  <b s="a"/>
 </items>
</root>

Где элементы в корне являются потомками от общего базового класса. Я просто не могу заставить его работать. Следующий фрагмент создает

<root>
 <items>
  <Base xsi:type="A" s="a"/>
  <Base xsi:type="B" s="a"/>
 </items>
</root>

[Serializable]
[XmlInclude(typeof(A))]
[XmlInclude(typeof(B))]
public class Base
{
}

[Serializable]
public class A : Base
{
    public string a = "a";
}

[Serializable]
public class B : Base
{
    public string b = "b";
}

[Serializable]
public class Root
{
    public List<Base> items = new List<Base>();
}

Если я использую атрибут XmlType, я могу изменить имя типа xsi:, но не тег имени. Я также хочу использовать пользовательское пространство имен для одного из тегов, но если я добавлю Namespace в XmlType, я получу сообщение об ошибке, в котором говорится, что тип не найден, и необходимо добавить XmlInclude

Полагаю, это на самом деле довольно просто, я просто не мог понять, как ..

1 Ответ

10 голосов
/ 18 августа 2010

Вы ищете XmlArrayItemAttribute ?

[Serializable]
public class Root
{
    [XmlArrayItem("a", typeof(A), Namespace = "myns")]
    [XmlArrayItem("b", typeof(B))]
    public List<Base> items = new List<Base>();
}

Это будет сериализовано как:

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <items>
    <a xmlns="myns">
      <a>a</a>
    </a>
    <b>
      <b>b</b>
    </b>
  </items>
</Root>

Вы также можете использовать XmlElementAttribute , если хотите, чтобы элементы были прямыми потомками Root, вместо того, чтобы иметь элемент для элементов.

...