<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Head>
<h:talkId s:mustknow="1" xmlns:h="urn:schemas-test:testgate:hotel:2012-06">
sfasfasfasfsfsf</h:talkId>
</s:Head>
<s:Body>
<bookHotelResponse xmlns="urn:schemas-test:testgate:hotel:2012-06" xmlns:d="http://someURL" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<d:bookingReference>123456</d:bookingReference>
<d:bookingStatus>successful</d:bookingStatus>
<d:price xmlns:p="moreURL">
<d:total>105</d:total>
</d:price>
</bookHotelResponse>
</s:Body>
</s:Envelope>
J'essaie de lire le message savon ci-dessus XmlDocument
en utilisant C #:
XmlDocument document = new XmlDocument();
document.LoadXml(soapmessage); //loading soap message as string
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
manager.AddNamespace("d", "http://someURL");
XmlNodeList xnList = document.SelectNodes("//bookHotelResponse", manager);
int nodes = xnList.Count;
foreach (XmlNode xn in xnList)
{
Status = xn["d:bookingStatus"].InnerText;
}
Le nombre est toujours zéro et il ne lit pas les valeurs de status de réservation.
BookHotelResponse
est dans l'espace de noms urn:schemas-test:testgate:hotel:2012-06
(l'espace de noms par défaut dans l'exemple xml), vous devez donc fournir cet espace de noms dans vos requêtes:
XmlDocument document = new XmlDocument();
document.LoadXml(soapmessage); //loading soap message as string
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
manager.AddNamespace("d", "http://someURL");
manager.AddNamespace("bhr", "urn:schemas-test:testgate:hotel:2012-06");
XmlNodeList xnList = document.SelectNodes("//bhr:bookHotelResponse", manager);
int nodes = xnList.Count;
foreach (XmlNode xn in xnList)
{
Status = xn["d:bookingStatus"].InnerText;
}
Utilisez LINQ2XML
Pour lire bookingStatus, faites ceci
XElement doc = XElement.Load("yourStream.xml");
XNamespace s = "http://schemas.xmlsoap.org/soap/envelope/";//Envelop namespace s
XNamespace bhr="urn:schemas-test:testgate:hotel:2012-06";//bookHotelResponse namespace
XNamespace d="http://someURL";//d namespace
foreach (var itm in doc.Descendants(s + "Body").Descendants(bhr+"bookHotelResponse"))
{
itm.Element(d+"bookingStatus").Value;//your bookingStatus value
}
LINQ2XML est cool quoique .... :)
Si je comprends bien, vous souhaitez obtenir une réponse du service des savons. Si c'est le cas, vous n'avez pas à faire tout ce travail difficile (passer un appel, analyser xml, sélectionner des nœuds pour obtenir la valeur de la réponse) par vous-même ... vous devez plutôt ajouter une référence de service à votre projet. reste du travail pour vous, y compris la classe génératrice, l'appel asmx, etc. Plus d'informations à ce sujet ici https://msdn.Microsoft.com/en-us/library/bb628649.aspx
Tout ce que vous devez faire après avoir ajouté une référence consiste à appeler une méthode de classe
var latestRates = (new GateSoapClient())?.ExchangeRatesLatest();
return latestRates?.Rates;
Tout d'abord, vous voulez créer une classe pour déseralize les valeurs XML en
public class bookHotelResponse {
public int bookingReference { get; set; }
public int bookingStatus { get; set; }
}
Ensuite, vous pouvez utiliser GetElementsByTagName
pour extraire le corps de la requête soap et déseralize la chaîne de requête en objet.
private static T DeserializeInnerSoapObject<T>(string soapResponse)
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(soapResponse);
var soapBody = xmlDocument.GetElementsByTagName("soap:Body")[0];
string innerObject = soapBody.InnerXml;
XmlSerializer deserializer = new XmlSerializer(typeof(T));
using (StringReader reader = new StringReader(innerObject))
{
return (T)deserializer.Deserialize(reader);
}
}