Для простого и быстрого доступа к значениям вы можете использовать XmlReader
для чтения ответа SOAP, чтобы найти сопоставления LocalName
/ Value
от каждого XmlElement
, а затем сохранить результаты в NameValueCollection
(илинезависимо от того, ICollection
вы предпочитаете):
public static void Main()
{
string strResponse = "<?xml version=\'1.0\' encoding=\'UTF-8\'?>\r\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">\r\n <soapenv:Body>\r\n <ns:getOrteByPlzResponse xmlns:ns=\"----------\">\r\n <ns:return xmlns:ax215=\"----------\" xmlns:ax213=\"----------\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"ax213:Adressinfo\">\r\n <ax213:fehlerCode>1</ax213:fehlerCode>\r\n <ax213:fehlerMeldungLength>0</ax213:fehlerMeldungLength>\r\n <ax213:input xsi:type=\"ax213:AdressinfoParameter\">\r\n <ax213:strassenRequest xsi:nil=\"true\"/>\r\n <ax213:stringRequest>69126</ax213:stringRequest>\r\n <ax213:validationsRequest xsi:nil=\"true\"/>\r\n </ax213:input>\r\n <ax213:itag>BPTest1;;26.04.2019,15:16:21</ax213:itag>\r\n <ax213:ort xsi:type=\"ax213:Ort\">\r\n <ax213:alort>22810500</ax213:alort>\r\n <ax213:gkz>08221000</ax213:gkz>\r\n <ax213:ortsname>Heidelberg</ax213:ortsname>\r\n <ax213:ortsteil>Boxberg</ax213:ortsteil>\r\n <ax213:ortsteil>Emmertsgrund</ax213:ortsteil>\r\n <ax213:ortsteil>Rohrbach</ax213:ortsteil>\r\n <ax213:ortsteil>Südstadt</ax213:ortsteil>\r\n <ax213:ortsteilLength>4</ax213:ortsteilLength>\r\n <ax213:plzLength>0</ax213:plzLength>\r\n </ax213:ort>\r\n <ax213:ortLength>1</ax213:ortLength>\r\n <ax213:strasseLength>0</ax213:strasseLength>\r\n <ax213:validation xsi:nil=\"true\"/>\r\n </ns:return>\r\n </ns:getOrteByPlzResponse>\r\n </soapenv:Body>\r\n</soapenv:Envelope>";
NameValueCollection nameValueCollection = new NameValueCollection();
try
{
using (StringReader stringReader = new StringReader(strResponse))
{
using (XmlReader xmlReader = XmlReader.Create(stringReader, new XmlReaderSettings()))
{
xmlReader.MoveToContent();
string strKeyValue = null;
do
{
switch (xmlReader.NodeType)
{
case XmlNodeType.Text:
strKeyValue = xmlReader.Value;
break;
case XmlNodeType.EndElement:
if (!string.IsNullOrEmpty(strKeyValue))
{
nameValueCollection.Add(xmlReader.LocalName, strKeyValue);
}
break;
default:
strKeyValue = null;
break;
}
} while (xmlReader.Read());
}
}
}
catch (Exception parentException)
{
Console.WriteLine(parentException);
}
}
Чтобы получить строковое значение для любого XmlElement
, вам необходимо получить доступ к NameValueCollection
по известному ключу (без префикса пространства имен).Например:
nameValueCollection["fehlerCode"]
Пример вывода AllKeys
и значений:
Console.Write(string.Join(Environment.NewLine, nameValueCollection.AllKeys.Select(x => x + ": " + nameValueCollection[x])));
fehlerCode: 1
fehlerMeldungLength: 0
stringRequest: 69126
itag: BPTest1;;26.04.2019,15:16:21
alort: 22810500
gkz: 08221000
ortsname: Heidelberg
ortsteil: Boxberg,Emmertsgrund,Rohrbach,Südstadt
ortsteilLength: 4
plzLength: 0
ortLength: 1
strasseLength: 0