2

我试图弄清楚如何正确序列化我的 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();

有几件事我不确定。我有 2 个 XmlDocuments 我需要在同一个 HTTPWebRequest 中发送。我之前尝试过将 XmlDocuments 转换为字符串并将它们连接起来(以发送字符串),但是当我使用 StringBuilder / Writer 时,它添加了:

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

我已经在我的 XmlDocument 对象中有声明,所以现在它在那里两次,我不能<string...在那里拥有该部分。将 XmlDocuments 转换为字符串然后将它们连接起来并发送它是否更容易,或者是否有一种简单的方法可以按原样发送 XmlDocuments?

编辑:

请参阅C# XmlDocument 节点 当我尝试将我的 XmlDocument 之一转换为字符串时,它显示为

  <?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>

4

3 回答 3

1

我猜这个问题与前一个问题有关,即如果不先将它们都包装在根节点( C# XmlDocument Nodes)中,则无法将 2 个 xml 文档组合成一个文档。

如果是这种情况,那么您不希望序列化 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。

希望我没有完全搞错。

于 2009-07-09T17:25:37.257 回答
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><...

不知道为什么有 2x<?xml version...

于 2009-07-09T17:44:14.147 回答
-2

我现在用 UPS 做这个,而不是用 XML 构建文档,我只是使用了这样的字符串构建器:

...在代码中:

AddNode("name", "value");

...在班上:

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

我个人认为它更好,因为它减少了服务器负载。

于 2009-09-15T22:47:18.873 回答