I want XML in the following format:
<configuration><!-- Only one configuration node --> <logging>...</logging><!-- Only one logging node --> <credentials>...</credentials><!-- One or more credentials nodes --> <credentials>...</credentials> </configuration>
I'm trying to create a class Configuration
that has the [Serializable]
attribute. To serialize the credentials nodes, I have the following:
[XmlArray("configuration")] [XmlArrayItem("credentials", typeof(CredentialsSection))] public List<CredentialsSection> Credentials { get; set; }
However, when I serialize this to XML, the XML is in the following format:
<configuration> <logging>...</logging> <configuration><!-- Don't want credentials nodes nested in a second configuration node --> <credentials>...</credentials> <credentials>...</credentials> </configuration> </configuration>
If I remove the [XmlArray("configuration")]
line, I get the following:
<configuration> <logging>...</logging> <Credentials><!-- Don't want credentials nodes nested in Credentials node --> <credentials>...</credentials> <credentials>...</credentials> </Credentials> </configuration>
How can I serialize this the way I want, with multiple <credentials>
nodes within the single root node <configuration>
? I wanted to do this without having to implement IXmlSerializable
and do custom serialization. This is how my class is described:
[Serializable] [XmlRoot("configuration")] public class Configuration : IEquatable<Configuration>
The following should serialize properly the way you want. The clue being [XmlElement("credentials")]
on the list. I did this by taking your xml, generating a schema (xsd) from it in Visual Studio. Then running xsd.exe on the schema to generate a class. (And some small edits)
public class CredentialsSection { public string Username { get; set; } public string Password { get; set; } } [XmlRoot(Namespace = "", IsNullable = false)] public class configuration { /// <remarks/> public string logging { get; set; } /// <remarks/> [XmlElement("credentials")] public List<CredentialsSection> credentials { get; set; } public string Serialize() { var credentialsSection = new CredentialsSection {Username = "a", Password = "b"}; this.credentials = new List<CredentialsSection> {credentialsSection, credentialsSection}; this.logging = "log this"; XmlSerializer s = new XmlSerializer(this.GetType()); StringBuilder sb = new StringBuilder(); TextWriter w = new StringWriter(sb); s.Serialize(w, this); w.Flush(); return sb.ToString(); } }
give the following output
<?xml version="1.0" encoding="utf-16"?> <configuration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <logging>log this</logging> <credentials> <Username>a</Username> <Password>b</Password> </credentials> <credentials> <Username>a</Username> <Password>b</Password> </credentials> </configuration>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With