Как применить несколько пространств имен XML к одному и тому же классу с помощью XML Serializer - PullRequest
4 голосов
/ 03 июня 2009

Я пытаюсь сгенерировать прокси-класс с WCF, который при сериализации преобразует и экземпляр класса ниже в XML ниже.

Однако, когда я пытаюсь применить пространства имен к классам, они вставляются неправильно или не добавляются вовсе.

Что я делаю не так? Как я могу это исправить?

Большое спасибо заранее.

Структура класса:

[XmlRoot]
public class Request
{
  public int Id

  public Name Name {get;set;}
}

[XmlRoot]
public class Name
{
  [XmlAttribute]
  public bool test {get;set;}

  public string FirstName {get;set;}

  public string LastName {get;set;}
}

Желаемая структура XML (лишний XML обрезан) :

<x1:Request xmlns:x1="Data/Main" xmlns:x2="Data/All">
  <x2:Id>0</x2:Id>
  <x2:Name test="true">
    <x2:FirstName>Dan</x2:FirstName>
    <x2:LastName>Atkinson</x2:LastName>
  </x2:Name>
</x1:Request>

1 Ответ

7 голосов
/ 03 июня 2009

Если вы говорите об (xml) атрибутах (т.е. <foo bar="abc"/>), то вы не говорите о DataContractSerializer - так что, возможно, придерживайтесь XmlType и т. Д., Например:

[XmlRoot(Namespace="Data/Main")]
public class Request {
  [XmlElement(Namespace = "Data/All")]
  public int Id { get; set; }
  [XmlElement(Namespace="Data/All")]
  public Name Name {get;set;}
}

[XmlType(Namespace="Data/All")]
public class Name {
  [XmlAttribute("test")]
  public bool Test {get;set;}
  public string FirstName {get;set;}
  public string LastName {get;set;}
}

Это не имеет псевдонимов - но, похоже, это правильно, по крайней мере ...

Объедините атрибуты выше с кодом "Guard" XmlSerializerNamespaces, и он должен быть там ...

(кредит здесь "Охрана", но это все равно вики ...)

    Request req = new Request {
        Id = 0, Name = new Name {
            Test = true, FirstName = "Dan", LastName = "Atkinson"
        }
    };
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("x1", "Data/Main");
    ns.Add("x2", "Data/All");
    new XmlSerializer(req.GetType()).Serialize(Console.Out, req,ns);
...