2013-12-09 17 views
4

當我得到一個XML,我需要將其反序列化到一個spec對象並通過參數傳遞給一個web服務方法。如何忽略將反序列化xml到對象的soap東西?

代碼:

var document = new XmlDocument(); 
     document.Load(@"C:\Desktop\CteWebservice.xml"); 
var serializer = new XmlSerializer(typeof(OCTE)); 
var octe = (OCTE) serializer.Deserialize(new StringReader(document.OuterXml)); 

serviceClient.InsertOCTE(octe); 

但是當我嘗試反序列化,我得到一個錯誤說

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" > was not expected. 

我需要忽略信封標籤和其他SOAP的東西。 我該怎麼做?

編輯:

的xml文件:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
       xmlns:ns="http://192.168.1.180:8085/"> 
<soapenv:Header/> 
<soapenv:Body> 
    <ns:INCLUIRCONHECIMENTOFRETESAIDA> 
    <ns:CONHECIMENTOFRETE> 
     <ns:CSTICMS></ns:CSTICMS> 
    </ns:CONHECIMENTOFRETE> 
    </ns:INCLUIRCONHECIMENTOFRETESAIDA> 
<soapenv:Body> 

測試代碼:

XNamespace soap = "http://schemas.xmlsoap.org/soap/envelope/"; 
    XNamespace m = "http://192.168.1.180:8085/"; 
    var soapBody = xdoc.Descendants(soap + "Body").First().FirstNode; 

    var serializer = new XmlSerializer(typeof(OCTE)); 
    var responseObj = (OCTE)serializer.Deserialize(soapBody.CreateReader()); 

的SOAPBody得到與我需要的所有信息。但是當我將它反序列化爲responseObj時,我將所有值都設爲null。

+0

使用'XDocument'並執行'document.Descendant(「OCTE」)'? (或任何根名應該是) –

+0

後裔,不知道如果我可以找到這個成員在XmlDocument類。 – gog

+0

對,我把它與'XDocument'混淆了。你可以用那個班嗎?無論哪種方式,我相信有一種方法可以將XML樹導航到您的身體價值。 –

回答

6

我沒有足夠的細節,填補了命名空間和元素名稱你,但使用W3C's example SOAP response,下面的代碼和類將對象反序列化:

var xdoc = XDocument.Load(@"C:\Desktop\CteWebservice.xml"); 
XNamespace soap = "http://www.w3.org/2001/12/soap-envelope"; 
XNamespace m = "http://www.example.org/stock"; 
var responseXml = xdoc.Element(soap + "Envelope").Element(soap + "Body") 
         .Element(m + "GetStockPriceResponse"); 

var serializer = new XmlSerializer(typeof(GetStockPriceResponse)); 
var responseObj = 
     (GetStockPriceResponse)serializer.Deserialize(responseXml.CreateReader()); 


[XmlRoot("GetStockPriceResponse", Namespace="http://www.example.org/stock")] 
public class GetStockPriceResponse 
{ 
    public decimal Price { get; set; } 
} 

您可以對您的OCTE類執行相同的操作。

[XmlRoot("INCLUIRCONHECIMENTOFRETESAIDA",Namespace="http://192.168.1.180:8085/")] 
public class OCTE 
{ 
    // with property mapping to CONHECIMENTOFRETE, etc. 
} 
+0

對不起,但我沒有得到什麼是響應。 Web服務不返回任何響應。我把我的xml的一些重要部分放在OP中。謝謝 – gog

+0

@ggui響應對應於你有任何反映INCLUIRCONHECIMENTOFRETESAIDA的類。我假設這是OCTE,並且添加了代碼,以顯示您需要爲序列化程序提供哪種屬性才能理解這是什麼。 –

+0

是的,它是OCTE類。我得到octe.xml文件的信息,然後將其設爲OCTE對象,然後將其作爲參數發送給webservice。我試試你的解決方案。謝謝! – gog

1
+0

好的,但我需要得到所有的節點(它是一個巨大的XML,而OCTE對象具有XML的所有屬性)。如果我使用的例子,因爲我之前說我可以反序列化文件作爲一個OCTE對象沒有任何處理(除了一個,刪除SOAP的東西) – gog