Member 11774876 Ответов: 3

Как прочитать ответ soap в c#?


Ответ мыла как:
<?xml version="1.0" encoding="utf-8" ?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<soap:Body>
		<LoginResponse xmlns="http://example.com/SystemIntegration">
  			<FirstName>@FirstName</FirstName>
			<LastName>@LastName</LastName>
		</LoginResponse>
    </soap:Body>
 </soap:Envelope>


Я пытаюсь прочитать это как:
XDocument doc = XDocument.Parse(strReturnStatus);
List<XElement> result = doc.Elements("LoginResponse").ToList();
for (int intc = 0; intc <= result.Count - 1; intc++)
{
    strResponseCode = result[intc].Element("FirstName").Value.ToString();
    strResponseText = result[intc].Element("LastName").Value.ToString();
}


Но он возвращает нулевой результат.

Как читать выше respose in asp.net с#??

Afzaal Ahmad Zeeshan

Что такое null, сам ответ или элемент?

3 Ответов

Рейтинг:
21

Richard Deeming

Первая проблема: То Elements метод выбирает только прямых потомков указанного узла. Вам нужно использовать Descendants вместо этого-метод.

Вторая проблема: Узел, который вы пытаетесь выбрать, не называется "LoginResponse"; он имеет пространство имен по умолчанию, которое является частью имени элемента. Вы должны включить это пространство имен при извлечении элементов.

XDocument doc = XDocument.Parse(strReturnStatus);
XNamespace ns = "http://example.com/SystemIntegration";
IEnumerable<XElement> responses = doc.Descendants(ns + "LoginResponse");
foreach (XElement response in responses)
{
    strResponseCode = (string)response.Element(ns + "FirstName");
    strResponseText = (string)response.Element(ns + "LastName");
}

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


Рейтинг:
1

F-ES Sitecore

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(strReturnStatus);

XmlNamespaceManager xmlnsManager = new System.Xml.XmlNamespaceManager(xmlDoc.NameTable);

xmlnsManager.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
xmlnsManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlnsManager.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");
xmlnsManager.AddNamespace("si", "http://example.com/SystemIntegration");

// You'd access the full path like this
XmlNode node = xmlDoc.SelectSingleNode("/soap:Envelope/soap:Body/si:LoginResponse/si:FirstName", xmlnsManager);
string firstname = node.InnerText;

// or just like this
node = xmlDoc.SelectSingleNode("//si:FirstName", xmlnsManager);
firstname = node.InnerText;


Richard Deeming

Код LINQ to XML более чистый. :)

Luiey Ichigo

простой, но эффективный

Рейтинг:
1

Member 14506957

Простое решение, если тело имеет несколько детей, и вам просто нужно удалить конверт:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(placeYourXmlHere);

if (xmlDoc.DocumentElement.Name == "soapenv_Envelope")
{
    string tempXmlString = xmlDoc.DocumentElement.InnerXml;
    xmlDoc.LoadXml(tempXmlString);
}

Если вы хотите удалить как конверт, так и тело, где тело содержит только одного ребенка:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(placeYourXmlHere);

while (xmlDoc.DocumentElement.Name == "soapenv_Envelope" || xmlDoc.DocumentElement.Name == "soapenv_Body")
{
    string tempXmlString = xmlDoc.DocumentElement.InnerXml;
    xmlDoc.LoadXml(tempXmlString);
}