Рейтинг:
14
Graeme_Grant
Во-первых, вам нужны классы для хранения Xml-данных. Я нахожу Xml2CSharp.com[^] помощи. Генерирует следующие классы из ваших Xml-данных:
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp
{
[XmlRoot(ElementName="RESPONSE_STATUS")]
public class RESPONSE_STATUS {
[XmlElement(ElementName="CODE")]
public string CODE { get; set; }
[XmlElement(ElementName="MESSAGE")]
public string MESSAGE { get; set; }
}
[XmlRoot(ElementName="RESPONSE_DATA")]
public class RESPONSE_DATA {
[XmlElement(ElementName="RESPONSE_STATUS")]
public RESPONSE_STATUS RESPONSE_STATUS { get; set; }
[XmlElement(ElementName="SESSION_ID")]
public string SESSION_ID { get; set; }
[XmlElement(ElementName="CITIZEN_NUMBER")]
public string CITIZEN_NUMBER { get; set; }
}
[XmlRoot(ElementName="BIOMETRIC_VERIFICATION")]
public class BIOMETRIC_VERIFICATION {
[XmlElement(ElementName="RESPONSE_DATA")]
public RESPONSE_DATA RESPONSE_DATA { get; set; }
[XmlAttribute(AttributeName="xsi", Namespace="http://www.w3.org/2000/xmlns/")]
public string Xsi { get; set; }
[XmlAttribute(AttributeName="xsd", Namespace="http://www.w3.org/2000/xmlns/")]
public string Xsd { get; set; }
}
}
Далее необходимо сопоставить классы с Xml-данными:
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace Xml2CSharp
{
public static class XmlConverter
{
public static T ToClass<T>(string data)
{
var response = default(T);
if (!string.IsNullOrEmpty(data))
{
var settings = new XmlReaderSettings() { IgnoreWhitespace = true };
var serializer = XmlSerializerFactoryNoThrow.Create(typeof(T));
var reader = XmlReader.Create(new StringReader(data), settings);
response = (T)Convert.ChangeType(serializer.Deserialize(reader), typeof(T));
}
return response;
}
}
// ref: http://stackoverflow.com/questions/1127431/xmlserializer-giving-filenotfoundexception-at-constructor/39642834#39642834
public static class XmlSerializerFactoryNoThrow
{
public static Dictionary<Type, XmlSerializer> cache = new Dictionary<Type, XmlSerializer>();
private static object SyncRootCache = new object();
public static XmlSerializer Create(Type type)
{
XmlSerializer serializer;
lock (SyncRootCache)
if (cache.TryGetValue(type, out serializer))
return serializer;
lock (type) //multiple variable of type of one type is same instance
{
//constructor XmlSerializer.FromTypes does not throw the first chance exception
serializer = XmlSerializer.FromTypes(new[] { type })[0];
//serializer = XmlSerializerFactoryNoThrow.Create(type);
}
lock (SyncRootCache) cache[type] = serializer;
return serializer;
}
}
}
использовать:
var data = XmlConverter.ToClass<BIOMETRIC_VERIFICATION>(xml);
Примечание: Я не запускал этот код, но должен работать.
Maciej Los
Не знал этого. Хорошо знать.
Овации,
Мацей
Graeme_Grant
У VS есть много трюков. ;)
junisarfraz
дорогой Грэм, на самом деле мы получаем несколько ответов от клиента. в некотором ответе есть разные узлы, как мы будем обобщать его, чтобы, если есть разные узлы кода, не выдавать ошибку..
Graeme_Grant
Это универсальный конвертер. Таким образом, для каждого типа ответа вам понадобится структура класса для сопоставления с XML. Просто скажите конвертеру тип класса для использования с XML-данными, и конвертер сделает все остальное.
junisarfraz
дорогой Грэм, спасибо за ваш ответ. если есть другие узлы, то то, что я упомянул, что я должен делать
Graeme_Grant
использование Xml2CSharp.com или xsd для обновления классов, а код конвертера сделает все остальное.