Сериализовать 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();

Несколько вещей, в которых я не уверен. У меня есть 2 XmlDocuments, которые мне нужно отправить в одном и том же HTTPWebRequest. Раньше я пытался преобразовать XmlDocuments в строки и просто объединить их (для отправки строки), но когда я использовал StringBuilder/Writer, он добавляет:

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


person Chris Klepeis    schedule 09.07.2009    source источник
comment
Можете ли вы показать, как должен выглядеть XML? Нельзя отправлять два документа подряд — должен быть корневой элемент.   -  person John Saunders    schedule 09.07.2009
comment
Кроме того, как определяется xmlRequest?   -  person user7116    schedule 09.07.2009


Ответы (3)


Я предполагаю, что этот вопрос связан с предыдущим вопросом о том, что 2 xml-документа невозможно объединить в один документ без предварительной упаковки их обоих в корневом узле (C# XmlDocument Nodes).

Если это так, то вы не хотите сериализовать XmlDocuments и отправлять их в WebService. Сериализация объектов предназначена для транспортировки/хранения фактического объекта, а не данных. Вы хотите просто отправить веб-службе данные, а не объект, поэтому просто объедините два документа 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.

Надеюсь, я не ошибся концом палки.

person Russell Troywest    schedule 09.07.2009

Работает (отчасти)! Спасибо, вот код:

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

person Chris Klepeis    schedule 09.07.2009

Я делаю это сейчас с UPS, вместо того, чтобы создавать документы в XML, я просто использовал конструкторы строк, например:

... в коде:

AddNode("name", "value");

...в классе:

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

Я лично думаю, что это лучше, потому что это снижает нагрузку на сервер.

person Community    schedule 15.09.2009