在c#中将字符串转换为xml会产生空白错误

Dan*_*Dan 3 c# xml asp.net linq-to-xml

我不是.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;
    }
Run Code Online (Sandbox Code Playgroud)

但是,当我打电话给我时,我收到一个错误:

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.
Run Code Online (Sandbox Code Playgroud)

我发现了一些帖子暗示事情(比如放在sb.Clear()那里)但没有任何作用.它似乎认为XML字符串顶部有一些空间,但我看不出有.我能看到的唯一略显狡猾的事情就是那里有两条<?xml version='1.0'?>线.这虽然来自UPS文档,我有一个旧的经典ASP应用程序使用几乎完全相同的XML,它工作正常,所以我不确定这是什么问题.

请问有人能指出我正确的方向吗?

非常感谢.

Mik*_*scu 5

那么,您生成的XML肯定不是有效的XML 文档.它实际上是2个XML文档,一个接一个.

作为旁注,您可能希望使用.Net XmlWriter类来构建XML文档,因为它更具表现力,可以帮助您查明在构建文档时出现的任何错误.

但是,这应该只是一块XML而不是你真正想要的是将它解析为文档片段<?XML ... ?>完全删除声明.


小智 5

据我所知,该行<?xml version='1.0'?>必须是XML文档中的第一行,并且必须只有一个根节点.您没有根节点/或两个根节点:AccessRequest和RatingServiceSelectionRequest.看起来你只是将一个xml doc附加到另一个.

您应该将两个节点RatingServiceSelectionRequest和AccessRequest放在一个根节点中