【问题标题】:Serialize XmlDocument & send via HTTPWebRequest序列化 XmlDocument 并通过 HTTPWebRequest 发送
【发布时间】:2013-01-11 22:42:38
【问题描述】:

我正在尝试弄清楚如何正确序列化我的 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 对象中已经有声明,所以现在它在那里两次,我不能在那里有 &lt;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> 

我希望我的根是&lt;TrackRequest&gt;

【问题讨论】:

  • 你能展示你想要的 XML 的样子吗?您不能连续发送两个文档 - 需要有一个根元素。
  • 还有,xmlRequest是怎么定义的?

标签: c# .net httpwebrequest xmldocument


【解决方案1】:

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

如果是这种情况,那么您不希望序列化 XmlDocument 并将它们发送到 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。

希望我没有完全搞错。

【讨论】:

    【解决方案2】:

    工作(有点)!谢谢,代码如下:

    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 &lt;?xml version...

    【讨论】:

      【解决方案3】:

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

      ...在代码中:

      AddNode("name", "value");
      

      ...在课堂上:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        • 2019-05-03
        相关资源
        最近更新 更多