Я пытаюсь десериализовать XML с помощью XmlSerializer (С#), который выглядит так:
<strokes>
<stroke timestamp="1405376883559">
<coord x="58.425" y="43.2375" d="0.0"/>
<coord x="58.6125" y="42.825" d="13.0"/>
<coord x="58.7625" y="42.7125" d="26.0"/>
<coord x="58.875" y="42.7125" d="40.0"/>
</stroke>
<stroke timestamp="1405376884991">
<coord x="67.95" y="40.6125" d="0.0"/>
<coord x="68.025" y="40.5" d="13.0"/>
<coord x="68.0625" y="40.3875" d="26.0"/>
</stroke>
<stroke timestamp="1405376885557">
<coord x="70.425" y="41.85" d="0.0"/>
<coord x="70.35" y="42.0" d="13.0"/>
<coord x="70.35" y="42.075" d="26.0"/>
<coord x="70.4625" y="42.1125" d="40.0"/>
<coord x="70.6125" y="42.15" d="53.0"/>
</stroke>
<stroke timestamp="1405376886058">
<coord x="70.6875" y="44.175" d="0.0"/>
<coord x="70.575" y="44.25" d="13.0"/>
</stroke>
<stroke timestamp="1405376886689">
<coord x="78.375" y="42.7125" d="0.0"/>
<coord x="78.1125" y="42.9" d="13.0"/>
<coord x="77.8125" y="43.0875" d="26.0"/>
<coord x="77.475" y="43.2375" d="40.0"/>
</stroke>
</stroke>
</strokes>
и мой ошибочный класс выглядит так
[XmlRoot("strokes", IsNullable = false)]
public class Strokes
{
private List<Stroke> strokes;
}
public class Stroke
{
public string timestamp;
[XmlArrayAttribute("stroke")]
List<coord> stroke;
}
[Serializable]
public class coord
{
[XmlAttribute]
public string x;
[XmlAttribute]
public string y;
[XmlAttribute]
public string d;
}
Я думаю, что мне не хватает некоторых атрибутов класса для описания того, что объект штриха имеет массив и временную метку. Я получаю "unknownNode", даже инициированный на узле xml "stroke",
Как я могу построить свой объект С# для соответствия этому xml?
Это должно сделать трюк:
[XmlRoot("strokes", IsNullable = false)]
public class Strokes
{
[XmlElement("stroke")]
public List<Stroke> strokes;
}
public class Stroke
{
[XmlAttribute]
public string timestamp;
[XmlElement("coord")]
public List<coord> coords;
}
[Serializable]
public class coord
{
[XmlAttribute]
public string x;
[XmlAttribute]
public string y;
[XmlAttribute]
public string d;
}
Они делают все, что вы хотите (де) сериализовать public
, и использовать XmlElement
вместо XmlArrayAttribute
в списке coord
s.
Там действительно полезный отзыв в Mikael Svenson отвечает на аналогичный вопрос:
Я сделал это, взяв ваш xml, создав в Visual Studio схему (xsd). Затем запустите xsd.exe в схеме для создания класса. (И некоторые небольшие изменения)
Если вы сделаете это для опубликованного XML, вы получите следующую рабочую версию списка элементов coord
например:
[System.Xml.Serialization.XmlElementAttribute("coord")]
public strokesStrokeCoord[] coord {
get {
return this.coordField;
}
set {
this.coordField = value;
}
}
XmlArrayAttribute
в классеStroke
должен быть"coord"
?