簡體   English   中英

XmlSerializer添加屬性

[英]XmlSerializer add attribute

我有這個項目類:

public class Movie
{
    public string VideoId { get; set; }
    public string Title { get; set; }
}

我有這個項目的List<Movie> ,我使用此代碼序列化為xml文件:

string fileName = index + ".xml";
string serializationFile = Path.Combine(dir, fileName);

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;

using (var writer = XmlWriter.Create(serializationFile, settings))
{
    var serializer = new XmlSerializer(typeof(List<Movie>));
    serializer.Serialize(writer, tmpList);
}

這就是結果:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMovie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Movie>
    <VideoId>MyId</VideoId>
    <Title>MyTitle</Title>
  </Movie>
  <Movie>
    <VideoId>MyId1</VideoId>
    <Title>MyTitle1</Title>
  </Movie>
  <Movie>
    <VideoId>MyId2</VideoId>
    <Title>MyTitle2</Title>
  </Movie>
  <Movie>
    <VideoId>MyId3</VideoId>
    <Title>MyTitle3</Title>
  </Movie>
</ArrayOfMovie>

這可以將屬性添加到ArrayOfMovie節點,如下所示:

<ArrayOfMovie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" customattribute='Yes'>

是的,您可以使用XmlAttribute屬性執行此操作。 為此,您需要定義自定義屬性。 它附帶一個代表數組的類的價格(嵌套在根節點中)。 如果您對此添加沒有任何問題,那么解決方案可能如下所示:

public class ArrayOfMovie
{
    // define the custom attribute
    [XmlAttribute(AttributeName="CustomAttribute")]
    public String Custom { get; set; }
    // define the collection description
    [XmlArray(ElementName="Items")]
    public List<Movie> Items { get; set; }
}

public class Movie
{
    public string VideoId { get; set; }
    public string Title { get; set; }
}

然后按照您的方式創建,填充和序列化 - 一件新事情是填充您的自定義屬性:

// create and fill the list
var tmpList = new List<Movie>();
tmpList.Add(new Movie { VideoId = "1", Title = "Movie 1" });
tmpList.Add(new Movie { VideoId = "2", Title = "Movie 2" });
// create the collection
var movies = new ArrayOfMovie 
            { 
                Items = tmpList, 
                Custom = "yes" // fill the custom attribute
            };
// serialize
using (var writer = XmlWriter.Create(serializationFile, settings))
{
    var serializer = new XmlSerializer(typeof(ArrayOfMovie));
    serializer.Serialize(writer, movies);
}

XML輸出如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMovie   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                CustomAttribute="yes">
  <Items>
    <Movie>
      <VideoId>1</VideoId>
      <Title>Movie 1</Title>
    </Movie>
    <Movie>
      <VideoId>2</VideoId>
      <Title>Movie 2</Title>
    </Movie>
  </Items>
</ArrayOfMovie>

您可以在序列化后執行此操作。 代碼框架如下所示:

    using (MemoryStream ms = new MemoryStream())
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;

        using (var writer = XmlWriter.Create(ms, settings))
        {
            var serializer = new XmlSerializer(typeof(List<Movie>));
            serializer.Serialize(writer, tmpList);
        }

        ms.Position = 0;
        XDocument doc = XDocument.Load(new XmlTextReader(ms));
        doc.Root.Add(new XAttribute("customAttribute", "Yes"));
        doc.Save(filename);
    }

您可能希望將List<Movie>包裝在類中,然后將其序列化。 像下面這樣的東西

class Program
{        
    static void Main(string[] args)
    {
        string fileName = "abcd2.xml";
        string serializationFile = Path.Combine(@"C:\", fileName);

        List<Movie> tmpList = new List<Movie>();
        tmpList.Add(new Movie() { VideoId = "1", Title = "Hello" });
        tmpList.Add(new Movie() { VideoId = "2", Title = "ABCD" });

        MovieList list = new MovieList("Yes", tmpList);

        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;

        using (var writer = XmlWriter.Create(serializationFile, settings))
        {
            var serializer = new XmlSerializer(typeof(MovieList));
            serializer.Serialize(writer, list);
        }
    }
}

public class MovieList
{
    private string custom;
    private List<Movie> movies;

    public MovieList() { }

    public MovieList(string custom, List<Movie> movies)
    {
        this.movies = movies;
        this.custom = custom;
    }

    [XmlAttribute]
    public string CustomAttribute
    {
        get { return this.custom; }
        set { this.custom = value; }
    }

    public List<Movie> Movies
    {
        get
        {
            return  movies;
        }
        set
        {
            this.movies = value;
        }
    }
}

public class Movie
{
    public string VideoId { get; set; }
    public string Title { get; set; }
}

代碼可以改進很多。 這只是一個示例代碼段。 查看以下MSDN鏈接: http//msdn.microsoft.com/en-us/library/58a18dwa( v= vs.110).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM