3

私は.NET開発者ではありませんが、実行する必要のある単純な(または単純なはずです!)タスクがあります。基本的に、さまざまな文字列値からXMLのチャンクを生成し、これをC#で有効なXMLオブジェクトにフォーマットする必要があります。私が持っているコードは次のようなものです:

private XDocument BuildPayload(string weight, string fromCountryCode, string fromZipCode, string toCountryCode, string toZipCode, string serviceTypeCode, string packageTypeCode, string pickupTypeCode)
    {

        string upsAccessLiscenseNumber = "xxxxxxxxxxxxxxxx";
        string upsUserID = "xxxxxxxxxx";
        string upsPassword = "xxxxxxxxx";
        string unitOfMeasurementWeight = "LBS";

        StringBuilder sb = new StringBuilder();
        sb.Clear();
        sb.Append("<?xml version='1.0'?>");
        sb.Append(" <AccessRequest xml:lang='en-US'>");
        sb.Append("     <AccessLicenseNumber>").Append(upsAccessLiscenseNumber).Append("</AccessLicenseNumber>");
        sb.Append("     <UserId>").Append(upsUserID).Append("</UserId>");
        sb.Append("     <Password>").Append(upsPassword).Append("</Password>");
        sb.Append(" </AccessRequest>");
        sb.Append("<?xml version='1.0'?>");
        sb.Append(" <RatingServiceSelectionRequest xml:lang='en-US'>");
        sb.Append("     <Request>");
        sb.Append("         <TransactionReference>");
        sb.Append("             <CustomerContext>Rating and Service</CustomerContext>");
        sb.Append("             <XpciVersion>1.0001</XpciVersion>");
        sb.Append("         </TransactionReference>");
        sb.Append("         <RequestAction>Rate</RequestAction>");
        sb.Append("         <RequestOption>Shop</RequestOption>");
        sb.Append("     </Request>");
        sb.Append("     <PickupType>");
        sb.Append("         <Code>").Append(pickupTypeCode).Append("</Code>");
        sb.Append("     </PickupType>");
        sb.Append("     <Shipment>");
        sb.Append("         <Shipper>");
        sb.Append("             <Address>");
        sb.Append("                 <PostalCode>").Append(fromZipCode).Append("</PostalCode>");
        sb.Append("          <CountryCode>").Append(fromCountryCode).Append("</CountryCode>");
        sb.Append("             </Address>");
        sb.Append("         </Shipper>");
        sb.Append("         <ShipTo>");
        sb.Append("             <Address>");
        sb.Append("                 <PostalCode>").Append(toZipCode).Append("</PostalCode>");
        sb.Append("                 <CountryCode>").Append(toCountryCode).Append("</CountryCode>");
        sb.Append("             </Address>");
        sb.Append("         </ShipTo>");
        sb.Append("         <Service>");
        sb.Append("             <Code>").Append(serviceTypeCode).Append("</Code>");
        sb.Append("         </Service>");
        sb.Append("         <Package>");
        sb.Append("             <PackagingType>");
        sb.Append("                 <Code>").Append(packageTypeCode).Append("</Code>");
        //sb.Append("                   <Description>Package</Description>");
        sb.Append("             </PackagingType>");
        sb.Append("             <Description>Rate Shopping</Description>");
        sb.Append("             <PackageWeight>");
        sb.Append("                 <UnitOfMeasurement>");
        sb.Append("                 <Code>").Append(unitOfMeasurementWeight).Append("</Code>");
        sb.Append("                 </UnitOfMeasurement>");
        sb.Append("                 <Weight>").Append(weight).Append("</Weight>");
        sb.Append("             </PackageWeight>");
        sb.Append("         </Package>");
        sb.Append("         <ShipmentServiceOptions/>");
        sb.Append("     </Shipment>");
        sb.Append("</RatingServiceSelectionRequest>");
        XDocument doc = XDocument.Parse(sb.ToString());
        return doc;
    }

ただし、これを呼び出すと、エラーが発生します。

Unexpected XML declaration. The XML declaration must be the first node in the document, and no white space characters are allowed to appear before it.

何かを示唆する投稿をいくつか見つけましたが(sb.Clear()そこに入れるなど)、何も機能しません。XML文字列の先頭にスペースがあるように見えますが、スペースがあることがわかりません。私が見ることができる唯一の少し危険なことは、そこに2本の<?xml version='1.0'?>線があるということです。これはUPSドキュメントからのものですが、これとまったく同じXMLを使用する古いClassic ASPアプリがあり、正常に動作するため、それが問題かどうかはわかりません。

誰かがこれで私を正しい方向に向けることができますか?

どうもありがとう。

4

4 に答える 4

5

さて、あなたが生成しているXMLは間違いなく有効なXMLドキュメントではありません。実際には2つのXMLドキュメントが次々にあります。

補足として、XMLドキュメントの作成には.Net XmlWriterクラスを使用することをお勧めします。これは、より表現力があり、ドキュメントの作成時に行った間違いを特定するのに役立つ場合があるためです。

ただし、これはXMLのチャンクであると想定されており、実際に必要なのは、それをドキュメントフラグメント<?XML ... ?>として解析し、宣言を完全に削除することです。

于 2013-03-21T15:10:38.423 に答える
5

私の知る限り、この行はXMLドキュメントの最初の行であり、ルートノードは1つ<?xml version='1.0'?>だけである必要があります。ルートノードがないか、AccessRequestとRatingServiceSelectionRequestの2つのルートノードがあります。あるxmlドキュメントを別のxmlドキュメントに追加しているようです。

1つのルートノードにRatingServiceSelectionRequestとAccessRequestの両方のノードを配置する必要があります

于 2013-03-21T15:10:39.200 に答える
4

あなたは2つの宣言でそれを呼びました。ドキュメントには、宣言とルート要素を1つだけ含めることができます。そこには2つの別々のドキュメントがあります。

正常に読み取られ、有効なXMLドキュメントをチェックしてはならないもの(ドキュメント全体ではなく、一度に1つの要素のみを読み取る単純なリーダー)。

于 2013-03-21T15:10:34.527 に答える
2

正しくないXMLです。XMLには、1つのルートと1つのxml宣言のみが必要です。

于 2013-03-21T15:17:10.100 に答える