Поскольку вы упомянули, что данные XML поступают из внешних источников, очевидно, что у вас нет контроля над этим.
Таким образом, вы можете следовать любой опции, как показано ниже:
- Создать отдельный класс за структуру данных XML, потому что, насколько я знаю, нет никакого способа управлять XML десериализации при использовании
XmlSerializer
- Вы можете используйте
XDocument
, чтобы прочитать XML самостоятельно, чтобы преодолеть это ограничение.
Если вы идете по второй идее, я создал небольшое консольное приложение, чтобы продемонстрировать это.
Главный кусок кода, как показано ниже:
MemoryStream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlData));
XDocument doc = XDocument.Load(xmlStream);
var records = from record in doc.Descendants("item").Descendants()
select new Item(!record.IsEmpty ? record.Value : record.Attribute("value").Value);
Здесь я читаю элемент, используя LinqToXml и проверки, если элемент не является пустым, т.е. Value
не пустым, а затем использовать Value
иначе чтения значение от элемента Attribute
.
Console приложение (полный код):
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Xml.Serialization;
namespace Console.TestApp
{
class Program
{
static string xmltypeFirst = @"<item>
<name>John</name>
</item>";
static string xmltypeSecond = @"<item>
<name value='Smith' />
</item>";
static void Main(string[] args)
{
var data = xmltypeFirst;
var result = Deserialize(data).ToList();
Console.WriteLine("Name: " + result[0].Name);
data = xmltypeSecond;
result = Deserialize(data).ToList();
Console.WriteLine("Name: " + result[0].Name);
Console.WriteLine("Press any to key to exit..");
Console.ReadLine();
}
private static IEnumerable<Item> Deserialize(string xmlData)
{
MemoryStream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlData));
XDocument doc = XDocument.Load(xmlStream);
var records = from record in doc.Descendants("item").Descendants()
select new Item(!record.IsEmpty ? record.Value : record.Attribute("value").Value);
return records;
}
}
[Serializable]
public class Item
{
public Item(string name)
{
this.Name = name;
}
[XmlElement("name")]
public string Name { get; set; }
}
}
Примечание: Для запуска этого вам нужно будет добавить ссылку на System.Xml.Linq.dll
в вашем проекте.
Ссылка: here
IMO это невозможно. Вам нужно будет доработать формат входных XML-файлов. Это интересный вопрос. – niksofteng