2009-07-09 77 views
1

我想弄清楚如何正確序列化我的XmlDocument並通過HTTPWebRequest對象發送它。序列化XmlDocument&通過HTTPWebRequest發送

這裏是我迄今:

Stream requestStream; 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://wwwcie.ups.com/ups.app/xml/Track"); 
request.Method = "POST"; 

request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = postData.Length; 
requestStream = request.GetRequestStream(); 

XmlSerializerNamespaces xsm = new XmlSerializerNamespaces(); 
xsm.Add("", ""); // remove namespace 
XmlSerializer ser = new XmlSerializer(xmlRequest.GetType()); 
ser.Serialize(requestStream, xmlRequest); 

requestStream.Write(postData, 0, postData.Length); 
requestStream.Close(); 

有幾件事情,我不確定。我有兩個XmlDocuments我需要在相同的HTTPWebRequest中發送。我已經嘗試過給XMLDocuments轉換爲字符串,只是將它們連接起來(發送字符串),但是當我用的StringBuilder /寫它補充說:

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://myNameSpace/"> 

我已經在我的XmlDocument聲明所以現在反對它在那裏兩次,我不能有<string...部分在那裏。將XmlDocuments轉換爲字符串然後將它們連接起來併發送它或者是否有一種簡單的方式來發送XmlDocuments?

編輯:

C# XmlDocument Nodes 當我嘗試我XmlDocuments的一個轉換爲字符串它顯示爲

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://myNamespace/"> 
     <TrackRequest> 
     <Request> 
      <TransactionReference> 
       <CustomerContext>whatever</CustomerContext> 
      </TransactionReference> 
     </Request> 
     <TrackingNumber>123</TrackingNumber> 
     </TrackRequest> 
    </string> 

我想我的根是<TrackRequest>

+0

你可以顯示你想要的XML看起來像什麼嗎?您無法連續發送兩個文檔 - 需要有一個根元素。 – 2009-07-09 16:57:14

回答

1

我猜測這個問題與前面的問題有關,大約2個xml文檔不能被合併成一個文檔而沒有將它們都包裝在一個根節點中首先(C# XmlDocument Nodes)。

如果是這種情況,那麼您不希望序列化XmlDocuments並將它們發送到WebService。序列化對象用於傳輸/存儲實際對象,而不是數據。你只想發送web服務的數據而不是對象,所以只需連接兩個XML文檔併發送。

use XmlDocument.OuterXml to get the XmlDocument as a string. ie: 

XmlDocument doc1 = new XmlDocument(); 
doc.LoadXml("Some XML"); 
XmlDocument doc2 = new XmlDocument(); 
doc2.LoadXml("Some other XML"); 
StringBuilder sb = new StringBuilder(); 
sb.Append(doc1.OuterXml); 
sb.Append(doc2.OuterXml); 

只需發送sb.ToString()到WebService。

希望我沒有得到完全錯誤的結局。

1

作品(有點)!謝謝,繼承人的代碼:

Stream requestStream; 
Stream responseStream; 
WebResponse response; 
StreamReader sr; 
byte[] postData; 
string postString; 
postString = xmlAccess.OuterXml + xmlRequest.OuterXml; 
postData = Encoding.UTF8.GetBytes(postString); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://wwwcie.ups.com/ups.app/xml/Track"); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = postData.Length; 
requestStream = request.GetRequestStream(); 

requestStream.Write(postData, 0, postData.Length); 
requestStream.Close(); 

response = request.GetResponse(); 
responseStream = response.GetResponseStream(); 
sr = new StreamReader(responseStream); 

return sr.ReadToEnd(); 

它仍然犯規返回雖然正確的XML:

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://namespace/"><?xml version="1.0" ?> <TrackResponse><Response><... 

不知道爲什麼有2個<?xml version...

-2

我與UPS現在這樣做,而不是建設XML中的文檔,我只是使用了字符串構建器,如下所示:

...在代碼中:

AddNode("name", "value"); 

...類:

private StringBuilder sb; 
public void AddNode(string name, string value) 
{ 
    sb.Append("<" + name + ">" + value + "</" + name + ">"); 
} 

我個人認爲這是更好,因爲它降低了服務器負載。

相關問題