junisarfraz Ответов: 2

Чтение данных из XML-документа C#


мой код упоминается ниже, где я загружаю данные в xml-документ.

XmlDocument doc = новый XmlDocument();
строки XML = кодировка.Кодировке utf8.Метода getString(resty.Сведения);
doc. LoadXml (xml);

innser XML содержит:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><VerifyFingerPrintsResponse xmlns="http://NADRA.Biometric.Verification"><VerifyFingerPrintsResult><?xml version="1.0" encoding="utf-16"?>

<BIOMETRIC_VERIFICATION xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <RESPONSE_DATA>

    <RESPONSE_STATUS>

      <CODE>175</CODE>

      <MESSAGE>transaction id already exist</MESSAGE>

    </RESPONSE_STATUS>

    <SESSION_ID>12313</SESSION_ID>

    <CITIZEN_NUMBER>4220106957335</CITIZEN_NUMBER>

  </RESPONSE_DATA>

</BIOMETRIC_VERIFICATION></VerifyFingerPrintsResult></VerifyFingerPrintsResponse></s:Body></s:Envelope>



внутренний текст :


<?xml version="1.0" encoding="utf-16"?>

<BIOMETRIC_VERIFICATION xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <RESPONSE_DATA>

    <RESPONSE_STATUS>

      <CODE>175</CODE>

      <MESSAGE>transaction id already exist</MESSAGE>

    </RESPONSE_STATUS>

    <SESSION_ID>12313</SESSION_ID>

    <CITIZEN_NUMBER>4220106957335</CITIZEN_NUMBER>

  </RESPONSE_DATA>

</BIOMETRIC_VERIFICATION>


Что я уже пробовал:

i want to retrieve data from above xml kindly  help me please
как я буду извлекать данные из вышеприведенного xml

2 Ответов

Рейтинг:
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

Я бы предпочел использовать xsd.exe вместо внешних услуг.
Видеть: Как использовать инструмент определения XML-схемы для создания классов и документов XML-схемы

Graeme_Grant

Преобразование XML в классы C# – .NET Diaries[^] ... да, я знаю о xsd.

Maciej Los

Не знал этого. Хорошо знать.
Овации,
Мацей

Graeme_Grant

У VS есть много трюков. ;)

junisarfraz

дорогой Грэм, на самом деле мы получаем несколько ответов от клиента. в некотором ответе есть разные узлы, как мы будем обобщать его, чтобы, если есть разные узлы кода, не выдавать ошибку..

Graeme_Grant

Это универсальный конвертер. Таким образом, для каждого типа ответа вам понадобится структура класса для сопоставления с XML. Просто скажите конвертеру тип класса для использования с XML-данными, и конвертер сделает все остальное.

junisarfraz

дорогой Грэм, спасибо за ваш ответ. если есть другие узлы, то то, что я упомянул, что я должен делать

Graeme_Grant

использование Xml2CSharp.com или xsd для обновления классов, а код конвертера сделает все остальное.

Рейтинг:
0

jimmson

Привет,

посмотрите на примеры на этой странице:

Класс XmlDocument (System.Xml)[^]