2012-08-30 19 views
7
<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> 

Estoy tratando de leer lo anterior mensaje de jabón XmlDocument usando C#:Leer Jabón mensaje usando 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; 
} 

El recuento es siempre cero y no está leyendo los valores bookingstatus.

+0

Por favor, corrija el formato, especialmente del mensaje XML (que en su mayoría falta). –

+0

el xml no es válido ... b es un espacio de nombre indefinido .. es d – Anirudha

+1

@anirudha Significado, b: total debe ser d: total en la muestra xml – dthorpe

Respuesta

14

BookHotelResponse está en el espacio de nombres urn:schemas-test:testgate:hotel:2012-06 (el nombre por defecto en el ejemplo xml) por lo que debe proporcionar ese espacio de nombres en sus consultas:

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; 
} 
+1

Funcionó para mí una vez que reemplacé el error de identificación del espacio de nombre 'b:' y cambié a en su ejemplo xml. ¿Estás seguro de que el xml en tu mensaje de jabón coincide con el formato de tu ejemplo? – dkackman

+0

hola gracias, funcionó, lo siento, hay un error tipográfico –

3

Uso LINQ2XML

Para leer bookingStatus, hacer esto

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 es fresco aunque .... :)

+0

gracias también este método también funciona –

1

Primera desea crear una clase para deseralize los valores XML en

public class bookHotelResponse { 
     public int bookingReference { get; set; } 
     public int bookingStatus { get; set; } 
    } 

A continuación, puede utilizar GetElementsByTagName para extraer el cuerpo de la petición jabón y deseralize la serie de petición en un objeto.

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); 
     } 
    } 
Cuestiones relacionadas