2016-12-04 13 views
0

USPSトラッキングAPIを使用しています。私は以下に列挙したように、要求の仕様を持っています。C#XMLSerializerを使用して、同じ名前で配列ではなく複数の子要素を許可できるXML要求を作成するには

<TrackFieldRequest PASSWORD="" USERID="prodsolclient" APPID=""> 
    <Revision>1</Revision> 
    <ClientIp>111.0.0.1</ClientIp> 
    <TrackID ID="5551212699300000962610" /> 
</TrackFieldRequest> 

ユーザーマニュアルには、「Webツールサーバーに入力された各要求に最大10個のトラッキングIDが含まれる可能性があります」と記載されています。

これは、TrackFieldRequestが最大10個のTrackID子要素を持つことができると解釈します。ただし、これらの複数のTrackID要素は配列内にあるとは定義されていません。それらは、TrackFieldRequest要素の最大10個の連続したTrackID子要素です。

したがって、10個のTrackID子要素を含める場合は、XMLSerializerに渡すCLRオブジェクトを構築する方法がわかりません。

"List TrackIds"というプロパティを持つTrackFieldRequestクラスを作成しようとしましたが、USPS Webサイトから "The element 'TrackFieldRequest'に無効な子要素 'TrackIds'があります。 : 'TrackID' "

XMLSerializerでTrackFieldRequestクラスのListまたはArrayプロパティを使用せずに、最大10個のTrackID子要素を生成するためにCLRクラスをモデル化するにはどうすればよいですか?ここで

は私の現在のTrackFieldRequestクラスは、ここで

public class TrackFieldRequest 
{ 
    // Based upon USPS Web Tools API User Guide(Track & Confirm API) version 3.3 dated 2/28/16 
    // at https://www.usps.com/business/web-tools-apis/track-and-confirm-api.pdf 

    [XmlAttribute("USERID")] 
    public string UserId { get; set; } 

    [XmlElement("Revision")] 
    public int Revision { get; set; } 

    [XmlElement("ClientIp")] 
    public string ClientIp { get; set; } 

    [XmlElement("SourceIdZIP")] 
    public string SourceIdZip { get; set; } 

    public List<TrackId> TrackIds { get; set; } 
} 

である私の現在のTrackIDクラスは、ここで

public class TrackId 
{ 
    // Based upon USPS Web Tools API User Guide(Track & Confirm API) version 3.3 dated 2/28/16 
    // at https://www.usps.com/business/web-tools-apis/track-and-confirm-api.pdf 

    public TrackId(string a_Id, string a_destinationZipCode, string a_mailingDate) 
    { 
     ID = a_Id; 
     DestinationZipCode = a_destinationZipCode; 
     MailingDate = a_mailingDate.ToString(); 
    } 

    // Parameterless constructor is needed for the XMLSerializer 
    public TrackId() 
    { 

    } 

    [XmlAttribute] 
    public string ID { get; set; } 

    [XmlElement("DestinationZipCode")] 
    public string DestinationZipCode { get; set; } 

    [XmlElement("MailingDate")] 
    public string MailingDate { get; set; } 

} 

あるのXmlWriterに

private string ConvertTrackingRequestToXml(TrackFieldRequest a_trackingRequest) 
    { 
     try 
     { 
      var xmlWriterSettings = new XmlWriterSettings 
      { 
       Encoding = new UTF8Encoding(false), 
       Indent = true, 
       IndentChars = "\t" 
      }; 
      XmlSerializer xmlSerializer = new XmlSerializer(a_trackingRequest.GetType()); 
      using (StringWriter stringWriter = new StringWriter()) 
      using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, xmlWriterSettings)) 
      { 
       xmlSerializer.Serialize(xmlWriter, a_trackingRequest); 
       return stringWriter.ToString(); 
      } 
     } 
     catch (Exception ex) 
     { 
      Logger.LogError("Could not convert tracking request into Xml.", ex); 
      return null; 
     } 
    } 
を使用してXMLにCLRクラスを変換するための私の方法です

私は、XmlSerializerを手動で構築するのではなく、 t可能であれば、文字列ビルダのXML文字列。

アイデア?

お手数ですがお寄せいただきありがとうございます。

答えて

0

は、このソリューションでは、働いていたと私はので、私は答えとして、それを受け入れる前進使用するものである。この

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string[] trackingNumbers = {"5551212699300000962610", "5551212699300000962611", "5551212699300000962612"}; 
      XElement trackFieldRequest = new XElement("TrackFieldRequest", new object[] { 
       new XAttribute("PASSWORD", "password"), 
       new XAttribute("USERID", "prodsolclient"), 
       new XAttribute("APPID", ""), 
       new XElement("Revision",1), 
       new XElement("ClientIp", "111.0.0.1") 
      }); 

      foreach (string trackingNumber in trackingNumbers) 
      { 
       trackFieldRequest.Add(new XElement("TrackID", trackingNumber)); 
      } 

      string xml = trackFieldRequest.ToString(); 
     } 
    } 
} 
+0

を試してみてください。 CLRクラスオブジェクトとXMLSerializerを使用してこのリクエストを作成するという洗練されたソリューションがあることを期待していましたが、これを見つけることができず、プロジェクトを進める必要があります。あなたの助けに感謝、jdweng – EiEiGuy

関連する問題