У меня есть следующий XML-файл.
<a>
<b>
<c>val1</c>
<d>val2</d>
</b>
<b>
<c>val3</c>
<d>val4</d>
</b>
<a>
Я хочу десериализовать это в класс, и я хочу получить доступ к ним с объектами созданного класса. Я использую C#. Я могу десериализовать и получить значение в объект класса‘a
’( <a>
тег). но как получить доступ к значению <b>
от этого объекта? Я сделал следующее кодирование:
[Serializable()] [XmlRoot("a")] public class a { [XmlArray("a")] [XmlArrayItem("b", typeof(b))] public b[] bb{ get; set; } } [Serializable()] public class b { [XmlElement("c")] public string c{ get; set; } [XmlElement("d")] public string d{ get; set; } } class Program { static void Main(string[] args) { a i = null; string path = "test.xml"; XmlSerializer serializer = new XmlSerializer(typeof(a)); StreamReader reader = new StreamReader(path); i = (a)serializer.Deserialize(reader); reader.Close(); //i want to print all b tags here Console.Read(); } }
Чтобы это работало, вы можете внести следующее изменение
public class a
{
[XmlElement("b")]
public b[] bb{ get; set; }
}
Используя атрибут XmlElement
в массиве, вы, по сути, сообщаете сериализатору, что элементы массива должны быть сериализованы / десериализованы как прямые дочерние элементы. текущего элемента.
Вот рабочий пример. Я помещаю XML в строку, чтобы сделать пример самодостаточным.
using System;
using System.IO;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string xml =
@"<a>
<b>
<c>val1</c>
<d>val2</d>
</b>
<b>
<c>val3</c>
<d>val4</d>
</b>
</a>";
XmlSerializer xs = new XmlSerializer(typeof(a));
a i = (a)xs.Deserialize(new StringReader(xml));
if (i != null && i.bb != null && i.bb.Length > 0)
{
Console.WriteLine(i.bb[0].c);
}
else
{
Console.WriteLine("Something went wrong!");
}
Console.ReadKey();
}
}
[XmlRoot("a")]
public class a
{
[XmlElement("b")]
public b[] bb { get; set; }
}
public class b
{
[XmlElement("c")]
public string c { get; set; }
[XmlElement("d")]
public string d { get; set; }
}
}
Я считаю, что самый простой способ решить проблему - это изменить определение классов a
и b
на следующее
public class b {
public string c { get; set; }
public string d { get; set; }
}
[XmlRoot(Namespace="", ElementName="a")]
public class a : List<b> { }
, затем ваша программа буду работать. При желании вы можете добавить к классу b
атрибут [XmlRoot (Namespace = "", ElementName = "b")]
Если вы сомневаетесь в создании классов сериализации xml, я считаю, что самый простой способ решить проблему:
Я написал краткое руководство по нему в сообщении в блоге некоторое время назад: http://www.diaryofaninja.com/blog/2010/05/07/make-your-xml-stronglytyped-because-you-can-and-its-easy
это занимает меньше минуты и затем вы можете легко настроить вещи оттуда. XSD.exe - ваш друг