具有自定义属性和元素名称的XML数组

时间:2018-04-20 00:13:38

标签: c# xml

我想在C#中序列化/反序列化xml文档,如:

<library>
    <my.books genre =""classic"">
         <book title = ""1984"" author=""George Orwell"" />
         <book title = ""Robinson Crusoe"" author=""Daniel Defoe"" />
         <book title = ""Frankenstein"" author=""Mary Shelly"" />
    </my.books>
</library>";

有两件重要的事情:

  • 元素“my.books”必须具有自定义名称(不是属性名称)

  • my.books元素必须具有属性(“genre”)。

这是我的代码(示例在https://dotnetfiddle.net/bH5WVX上):

   using System;
   using System.Xml;
   using System.Xml.Linq;
   using System.Collections.Generic;
   using System.ComponentModel;
   using System.Xml.Serialization;
   using System.IO;

   public class Program
   {
    public static void Main()
    {

        Library lib = new Library(myBooks: new MyBooks(
            genre: "classic",
            booklist: new List<Book>{
                new Book("1984", "George Orwell"),
                new Book("Robinson Crusoe", "Daniel Defoe"),
                new Book("Oliver Twist", "Mary Shelly"),

            }));


          XmlSerializer formatter = new XmlSerializer(typeof(Library));

            using (StringWriter sw = new StringWriter())
            {
                formatter.Serialize(sw, lib);
                Console.Write(sw.ToString());
            }

        string desiredOutput =
                @"<library>

                    <my.books genre =""classic"">
                        <book title = ""1984"" author=""George Orwell"" />
                        <book title = ""Robinson Crusoe"" author=""Daniel Defoe"" />
                        <book title = ""Frankenstein"" author=""Mary Shelly"" />
                    </my.books>

                </library>";            
    }


[XmlRoot("library")]    
public class Library
        {
        public MyBooks MyBooks { get; set; }

        [XmlElement("my.books")] 
        public List<Book> Books { get; set; }

        public Library()
    {

    }

    public Library(MyBooks myBooks = null)
    {
        MyBooks = myBooks;
    }
}


[XmlType("my.books")]
public class MyBooks
{
     [XmlAttribute("genre")]
        public string Genre { get; set; }

     [XmlElement("book")]
        public List<Book> Booklist { get; set; }

      public MyBooks(string genre, List<Book> booklist = null)
        {
            Genre = genre;
            Booklist = booklist;
        }

          public MyBooks()
        {

        }   
}   

public class Book
    {
        [XmlAttribute("title")]
        public string Title { get; set; }
        [XmlAttribute("author")]
        public string Author { get; set; }

        public Book() { }

        public Book(string title, string author)
        {
        Title = title;
        Author = author;    
        }
    }
}

输出是:

<library>
  <MyBooks genre="classic">
    <book title="1984" author="George Orwell" />
    <book title="Robinson Crusoe" author="Daniel Defoe" />
    <book title="Oliver Twist" author="Mary Shelly" />
  </MyBooks>
</library>

唯一的问题是我不能强迫元素“MyBooks”使用名称“my.books”

我发现只有一篇关于这个主题的相关文章 - http://www.codemeit.com/xml/c-xmlserializer-add-an-attribute-to-an-array-element.html,它建议在课堂上使用“XmlType”属性,但它在这里不起作用。

有没有办法在这个元素上应用自定义名称属性?

1 个答案:

答案 0 :(得分:1)

看起来你的属性属于错误的属性。

试试这个:

[System.Xml.Serialization.XmlElement("my.books")]
public MyBooks MyBooks { get; set; }

public List<Book> Books { get; set; }

我现在得到这个输出:

<?xml version="1.0" encoding="utf-16"?>
<library xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <my.books genre="classic">
    <book title="1984" author="George Orwell" />
    <book title="Robinson Crusoe" author="Daniel Defoe" />
    <book title="Oliver Twist" author="Mary Shelly" />
  </my.books>
</library>

写得很好的问题做得好!