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

时间:2013-03-21 15:06:31

标签: c# asp.net xml 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;
    }

然而,当我打电话给我时,我收到一个错误:

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字符串顶部有一些空间,但我看不出有。我能看到的唯一略显狡猾的事情就是那里有两条<?xml version='1.0'?>条线。这虽然来自UPS文档,我有一个旧的经典ASP应用程序,使用几乎完全相同的XML,它工作正常,所以我不确定这是问题。

有人可以指出我正确的方向吗?

非常感谢。

4 个答案:

答案 0 :(得分:5)

嗯,您生成的XML肯定是有效的XML 文档。它实际上是2个XML文档,一个接一个。

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

但是,这应该只是一大块XML 而不是你真正想要的是将它解析为文档片段并删除{{1}完全声明。

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

你用两个声明来调用它。您只能在文档中包含一个声明和一个根元素。那里你有两份单独的文件。

任何成功读取的东西都不能检查有效的XML文档 - 也许是一个只读取一个元素而不是整个文档的简单读者。

答案 3 :(得分:2)

这是不正确的XML。 XML应该只有一个root和一个xml声明。