2013-03-21 47 views
3

我不是.NET開發人員,但有一個簡單的(或應該很簡單!)任務來完成。我基本上需要從各種字符串值中生成一塊XML,並將其格式化爲C#中的有效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,並且工作正常,所以我不確定這是否是問題所在。

任何人都可以用這個指向正確的方向嗎?

非常感謝。

+2

如果你想保持行格式化,使用'sb.AppendLine'而不是'sb.Append'。 (雖然這不能解決你的問題) – 2013-03-21 15:15:07

+1

答案是這樣的,你在這裏有兩個XML文檔,而不是一個,這顯然是正確的。然而,更廣泛的問題是您正在通過字符串操作生成XML。更強大的工作方式可能是將模板XML文檔存儲在單獨的文件或資源中,讓程序將其解析爲「XDocument」或「XmlDocument」,然後使用某些東西將相關位置中的值戳出像XPath一樣。 – tomfanning 2013-03-21 15:21:24

+0

謝謝湯姆。我很喜歡API的期望,所以我必須將2個XML文件放在一起。實際上將它們作爲字符串發佈 - 在這種情況下實際上不需要轉換爲「正確的」XML對象。它感覺不太對勁,但它很有效。我也發現這也是同樣的問題:http://stackoverflow.com/questions/1104549/c-sharp-xmldocument-nodes – Dan 2013-03-21 15:33:21

回答

4

你用兩個聲明調用它。文檔中只能有一個聲明和一個根元素。你在那裏有兩個單獨的文件。

任何成功讀取的內容都不得檢查有效的XML文檔 - 可能是一次只讀取一個元素而不是整個文檔的簡單閱讀器。

5

那麼,您生成的XML肯定是而不是有效的XML 文檔。它實際上是2個XML文檔,一個接一個。

請注意,您可能希望使用.Net XmlWriter類來構建XML文檔,因爲它具有更強的表現力,並且可以幫助您確定在形成文檔時所犯的任何錯誤。

然而,這應該只是XML的一大塊不是你真正想要的是解析它作爲一個文檔片段和完全消除<?XML ... ?>聲明。

5

據我所知,那裏的線路<?xml version='1.0'?>必須是XML文檔中的第一行,並且必須確切地有一個根節點。您沒有根節點/或兩個根節點:AccessRequest和RatingServiceSelectionRequest。好像你只是將一個xml文檔附加到另一個文檔中。

你應該把兩個節點RatingServiceSelectionRequest和AccessRequest在一個根節點

+0

啊哈!就是這樣。這是由UPS運輸API建議(使用)的格式,所以我需要找到一種方法將它傳遞給UPS它是當前(無效)格式。由於它是作爲HTTP請求發佈的,因此它可能甚至不需要在我的代碼中轉換爲XML - 它只能作爲字符串發送。我不知道爲什麼我把自己轉換成一個XML對象 - 它只是感覺正確,但如果它不起作用,我不能這樣做,它可能只是一個字符串。 – Dan 2013-03-21 15:19:06

2

這是不正確的XML。 XML應該只有一個根和一個xml聲明。

相關問題