XmlSerializer Convert C# object to xml string
c#, linq, xml
Solution
You cannot serialize class from your question using standard serialization tools so that it will have `<book>` entries on the same level as `<bookNum>` node.
When class saved with standard serialization tools list of your `<book>` nodes will always be nested into separate array node that will be on the same level as `<bookNum>` node. Same concerns `records` array field on `book` class.
To generate XML output that you want to - with `<book>` nodes on same level as `<bookNum>` node - you will have to implement IXmlSerializable interface in your `books` class for custom serialization. To see examples of `IXmlSerializable` implementation visit these links: StackOverflow answer, CodeProject article.
Another solution will be - as stated user Alexandr in comment to my answer - to inherit your `books` class from `List<book>` type and to have on your `book` class field `records` of class type that is inherited from `List<record>` type.
When serializing class from your question, assuming that your assigned proper XmlRoot, XmlElement, XmlArray and XmlArrayItem attributes as follows:
[XmlRoot("books")]
public class books
{
[XmlElement("bookNum")]
public int bookNum { get; set; }
[XmlRoot("book")]
public class book
{
[XmlElement("name")]
public string name { get; set; }
[XmlRoot("record")]
public class record
{
[XmlElement("borrowDate")]
public string borrowDate { get; set; }
[XmlElement("returnDate")]
public string returnDate { get; set; }
}
[XmlArray("borrowRecords")]
[XmlArrayItem("record")]
public record[] records { get; set; }
}
[XmlArray("booksList")]
[XmlArrayItem("book")]
public book[] books { get; set; }
}
you will get XML output as follows:
<books>
<bookNum>2</bookNum>
<booksList>
<book>
<name>Book 1</name>
<borrowRecords>
<record>
<borrowDate>2013-1-3</borrowDate>
<returnDate>2013-1-5</returnDate>
</record>
<record>
<borrowDate>2013-2-3</borrowDate>
<returnDate>2013-4-5</returnDate>
</record>
</borrowRecords>
</book>
<book>
<name>Book 2</name>
<borrowRecords>
<record>
<borrowDate>2013-1-3</borrowDate>
<returnDate>2013-1-5</returnDate>
</record>
<record>
<borrowDate>2013-2-3</borrowDate>
<returnDate>2013-4-5</returnDate>
</record>
</borrowRecords>
</book>
</booksList>
</books>
Problem
I have created a C# class: ``` public class books { public int bookNum { get; set; } public class book { public string name { get; set; } public class record { public string borrowDate { get; set; } public string returnDate { get; set; } } public record[] records { get; set; } } public book[] books { get; set; } } ``` But is when I use XmlSerializer convert to XML string. The result is not the same as below xml. What is the problem of my C# class? I want to use XmlSerializer to ouput the result instead of using XmlDocument. Any ideas? Thanks in advance! ``` <books> <bookNum>2</bookNum> <book> <name>Book 1</name> <record> <borrowDate>2013-7-1</borrowDate> <returnDate>2013-7-12</returnDate> </record> <record> <borrowDate>2013-8-1</borrowDate> <returnDate>2013-8-5</returnDate> </record> </book> <book> <name>Book 2</name> <record> <borrowDate>2013-6-1</borrowDate> <returnDate>2013-6-12</returnDate> </record> <record> <borrowDate>2013-7-1</borrowDate> <returnDate>2013-7-5</returnDate> </record> </book> </books> ``` EDIT Below is my C# code and the ouput result: ``` books books = new books { bookNum = 2, Books = new books.book[] { new books.book { name = "Book1", records = new books.book.record[] { new books.book.record { borrowDate = "2013-1-3", returnDate = "2013-1-5" }, new books.book.record { borrowDate = "2013-2-3", returnDate = "2013-4-5" } } }, new books.book { name = "Book1", records = new books.book.record[] { new books.book.record { borrowDate = "2013-1-3", returnDate = "2013-1-5" }, new books.book.record { borrowDate = "2013-2-3", returnDate = "2013-4-5" } } } } }; XmlSerializer xsSubmit = new XmlSerializer(typeof(books)); XmlDocument doc = new XmlDocument(); System.IO.StringWriter sww = new System.IO.StringWriter(); XmlWriter writer = XmlWriter.Create(sww); xsSubmit.Serialize(writer, books); var xml = sww.ToString(); // Your xml context.Response.Write(xml); ``` XML: ``` <books> <bookNum>2</bookNum> <Books> <book> <name>Book1</name> <records> <record> <borrowDate>2013-1-3</borrowDate> <returnDate>2013-1-5</returnDate> </record> <record> <borrowDate>2013-2-3</borrowDate> <returnDate>2013-4-5</returnDate> </record> </records> </book> <book> <name>Book1</name> <records> <record> <borrowDate>2013-1-3</borrowDate> <returnDate>2013-1-5</returnDate> </record> <record> <borrowDate>2013-2-3</borrowDate> <returnDate>2013-4-5</returnDate> </record> </records> </book> </Books> </books> ```