我想在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”属性,但它在这里不起作用。
有没有办法在这个元素上应用自定义名称属性?
答案 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>
写得很好的问题做得好!