Как правильно сериализовать - PullRequest
0 голосов
/ 28 марта 2009

Если у меня есть класс MovieClass как

[XmlRoot("MovieClass")]
public class Movie
{
   [XmlElement("Novie")]
   public string Title;

   [XmlElement("Rating")]
   public int rating; 
}

Как я могу иметь атрибут "x: uid" в моем элементе "Movie", чтобы вывод при использовании XmlSerializer XmlSerializer s = new XmlSerializer(typeof(MovieClass)) это так:

<?xml version="1.0" encoding="utf-16"?>
<MovieClass>
   <Movie x:uid="123">Armagedon</Movie>
</MovieClass>

и не так

<?xml version="1.0" encoding="utf-16"?>
<MovieClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Movie x:uid="123" Title="Armagedon"/>
</MovieClass>

Примечание. Я хочу удалить xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema", если это возможно.

Ответы [ 2 ]

2 голосов
/ 28 марта 2009

Я ответил на это в вашем исходном сообщении, но я думаю, что это лучше сформулировано, поэтому я также опубликую его здесь, если оно будет закрыто как дубликат, вы можете изменить исходное сообщение, чтобы отразить этот вопрос.

Я не думаю, что это возможно без использования Title в качестве пользовательского типа или явной реализации методов сериализации.

Вы можете создать собственный класс, например ...

class MovieTitle
{
    [XmlText]
    public string Title { get; set; }
    [XmlAttribute(Namespace="http://www.myxmlnamespace.com")]
    public string uid { get; set; }
    public override ToString() { return Title; }
}

[XmlRoot("MovieClass")]
public class Movie
{
   [XmlElement("Movie")]
   public MovieTitle Title;
}

, который будет производить:

<MovieClass xmlns:x="http://www.myxmlnamespace.com">
  <Movie x:uid="movie_001">Armagedon</Movie>
</MovieClass>

Хотя сериализатор будет компенсировать неизвестные пространства имен с результатом, которого вы, вероятно, не ожидаете.

Вы можете избежать странного поведения, объявив свои пространства имен и предоставив объект сериализатору.

  XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
  ns.Add("x", "http://www.myxmlnamespace.com");
0 голосов
/ 28 марта 2009

Это недопустимый XML, если вы не объявили x в качестве префикса пространства имен. Ответ Квинтина говорит вам, как получить действительный XML.

...