Как сериализовать в XML, содержащий атрибуты?
-
20-09-2019 - |
Вопрос
У меня есть этот код:
...
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;
}
}
Я хочу добавить атрибуты к некоторым узлам и создать подузлы.Также как разобрать xml следующим образом:
<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>
Это не XML-файл, это ответ HTTP-сервера.
Решение
Было бы лучше, если бы у вас был файл XSD, описывающий XML, который вы будете получать с сервера.Затем вы можете использовать программу XSD.EXE для создания классов .NET с соответствующими атрибутами .NET.Затем вы можете просто использовать XmlSerializer.Deserialize
.
Я попробую создать для вас такой класс вручную.Это будет быстрая попытка, и она может оказаться ошибочной (мне пора возвращаться к работе!)
Попробуйте это и посмотрите, работает ли это.
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; }
}
Не связан с StackOverflow