首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XmlSerializer添加属性

XmlSerializer添加属性
EN

Stack Overflow用户
提问于 2014-03-16 10:34:21
回答 3查看 6.9K关注 0票数 5

我有这门课:

代码语言:javascript
复制
public class Movie
{
    public string VideoId { get; set; }
    public string Title { get; set; }
}

我有这些项的List<Movie>,我使用这段代码来序列化为xml文件:

代码语言:javascript
复制
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);
}

这就是结果:

代码语言:javascript
复制
<?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节点添加属性,如下所示:

代码语言:javascript
复制
<ArrayOfMovie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" customattribute='Yes'>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-16 12:32:24

是的,您可以使用XmlAttribute属性来完成这个任务。为了做到这一点,您需要定义自定义属性。它提供了表示数组(嵌套在根节点中)的另一个类的代价。如果您对此添加没有问题,那么解决方案可以如下所示:

代码语言:javascript
复制
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; }
}

然后像您已经做的那样创建、填充和序列化--新的一件事是填充您的自定义属性:

代码语言:javascript
复制
// 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输出如下所示:

代码语言:javascript
复制
<?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>
票数 4
EN

Stack Overflow用户

发布于 2014-03-16 11:27:52

序列化后可以这样做。代码框架如下所示:

代码语言:javascript
复制
    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);
    }
票数 0
EN

Stack Overflow用户

发布于 2014-03-16 11:31:49

您可能希望将List<Movie>包装在类中,然后序列化它。如下所示

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22435755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档