2009-07-09 91 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 + ">"); 
} 

我个人认为这是更好,因为它降低了服务器负载。

相关问题