Cómo serializar a XML que contiene atributos?
-
20-09-2019 - |
Pregunta
Tengo este código:
...
request data = new request();
data.username = formNick;
xml = data.Serialize();
...
[System.Serializable]
public class request
{
public string username;
public string password;
static XmlSerializer serializer = new XmlSerializer(typeof(request));
public string Serialize()
{
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Encoding = Encoding.UTF8;
serializer.Serialize(
System.Xml.XmlWriter.Create(builder, settings ),
this);
return builder.ToString();
}
public static request Deserialize(string serializedData)
{
return serializer.Deserialize(new StringReader(serializedData)) as request;
}
}
Quiero añadir atributos a algunos nodos y crear algunos sub-nodos. También la forma de analizar XML siguiente:
<answer>
<player id="2">
<coordinate axis="x"></coordinate>
<coordinate axis="y"></coordinate>
<coordinate axis="z"></coordinate>
<action name="nothing"></action>
</player>
<player id="3">
<coordinate axis="x"></coordinate>
<coordinate axis="y"></coordinate>
<coordinate axis="z"></coordinate>
<action name="boom">
<1>1</1>
<2>2</2>
</action>
</player>
</answer>
No es un archivo XML, que es una respuesta del servidor HTTP.
Solución
Lo mejor sería si tuviera un archivo XSD que describe el XML que va a recibir desde el servidor. A continuación, puede utilizar el programa xsd.exe para producir clases .NET con los atributos de .NET adecuada sobre ellos. A continuación, puede simplemente usar XmlSerializer.Deserialize
.
Voy a tratar de crear una clase suponen para usted con la mano. Este será un intento rápido, y puede estar mal (tengo que volver al trabajo!)
Probar y ver si funciona.
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
[XmlRoot("answer")]
public class Answer
{
[XmlElement]
public List<Player> Players { get; set; }
}
public class Player
{
[XmlAttribute("id")]
public int ID { get; set; }
[XmlElement]
public List<Coordinate> Coordinates { get; set; }
[XmlElement("action")]
public PlayerAction Action { get; set; }
}
public class PlayerAction
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAnyElement]
public XmlElement[] ActionContents { get; set; }
}
public enum Axis
{
[XmlEnum("x")]
X,
[XmlEnum("y")]
Y,
[XmlEnum("z")]
Z
}
public class Coordinate
{
[XmlAttribute("axis")]
public Axis Axis { get; set; }
[XmlText]
public double Value { get; set; }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow