using XmlArrayItem attribute without XmlArray on Serializable C# class
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>
Sarah Vessels
I'm a software developer at GitHub, working out of Nashville, Tennessee. I love black tea and electropop, puns and hot chicken. When I'm not writing code, I'm playing video games like Skyrim, Diablo 3, and The Sims series. I sometimes blog about video games and tech.
Updated on July 22, 2020Comments
-
Sarah Vessels almost 4 years
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 implementIXmlSerializable
and do custom serialization. This is how my class is described:[Serializable] [XmlRoot("configuration")] public class Configuration : IEquatable<Configuration>