无法将非白色 space 字符添加到 XDocument 和 UPS API 的内容中

Non white space characters cannot be added to content with XDocument and UPS API

我正在尝试使用 xDocument 在 xml 中发送 UPSAPI 请求。但出于某种原因,我在尝试制作 xml 时遇到错误?我收到错误:

非白色 space 字符无法添加到内容中。

在字符串生成器本身上,而不是在特定区域。所以我不知道它在哪里失败。这是代码:

        var requestXml = new XDocument(
            new XDeclaration("1.0", "utf-16", "yes"),
            new XElement("AccessRequest",
                new XAttribute(XNamespace.Xml + "lang", "en"),
                new XElement("AccessLicenseNumber", "LICENCE"),
                new XElement("UserId", "USERID"),
                new XElement("Password", "PASSWORD")),

            new XDeclaration("1.0", "utf-16", "yes"),
            new XElement("RatingServiceSelectionRequest",
                new XAttribute(XNamespace.Xml + "lang", "en"),
                new XElement("Request",
                    new XElement("TransactionReference",
                        new XElement("CustomerContext", "Rating and Service"),
                        new XElement("XpciVersion", "1.0001")),
                    new XElement("RequestAction", "Rate"),
                    new XElement("RequestOption", "Rate")),

                new XElement("PickupType",
                    new XElement("Code", "01"),
                    new XElement("Description", "Daily Pickup")),

                new XElement("Shipment",
                    new XElement("Shipper",
                        new XElement("Address",
                            new XElement("PostalCode", "33706"),
                            new XElement("CountryCode", "US"))),

                    new XElement("ShipTo",
                        new XElement("Address",
                            new XElement("ResidentialAddressIndicator", ""), //GET from postObject
                            new XElement("PostalCode", "34221"), //GET from postObject
                            new XElement("CountryCode", "US"))), //GET from postObject

                    new XElement("ShipFrom",
                        new XElement("Address",
                            new XElement("PostalCode", "33706"),
                            new XElement("CountryCode", "US"))),

                    new XElement("Service",
                        new XElement("Code", "03")), //GET from postObject

                    new XElement("Package",
                        new XElement("PackagingType",
                            new XElement("Code", "02")),

                        new XElement("Dimensions",
                            new XElement("UnitOfMeasurement",
                                new XElement("Code", "IN")),
                            new XElement("Length", "20"),
                            new XElement("Width", "20"),
                            new XElement("Height", "20")),

                        new XElement("PackageWeight",
                            new XElement("UnitOfMeasurement",
                                new XElement("Code", "LBS")),
                            new XElement("Weight", "10")))))); //GET from postObject

更新:

好的所以消除大部分代码我得到错误:

此操作将创建结构不正确的文档。

有了这个:

        var requestXml = new XDocument(
            new XDeclaration("1.0", "utf-8", "yes"),
            new XElement("AccessRequest",
                new XAttribute(XNamespace.Xml + "lang", "en"),
                new XElement("AccessLicenseNumber", "LICENCE"),
                new XElement("UserId", "USERID"),
                new XElement("Password", "PASSWORD")),
            new XElement("RatingServiceSelectionRequest", "this"));

直译为:

    <?xml version="1.0" encoding="UTF-16"?>
    <AccessRequest xml:lang="en-US">
           <AccessLicenseNumber>LICENCE</AccessLicenseNumber>
           <UserId>USERID</UserId>
           <Password>PASSWORD</Password>
    </AccessRequest>
    <RatingServiceSelectionRequest>this</RatingServiceSelectionRequest>

怎么结构不正确?我错过了什么吗?

XDocument 不允许如上所述的多个根。但是 UPS 运输 API 需要两个根,一个用于许可证验证请求,另一个用于计算请求。因此我不得不将两者分成字符串:

        //Licence verification:
        var accessXML = new XDocument(
            new XDeclaration("1.0", "utf-8", "yes"),
            new XElement("AccessRequest",
                new XAttribute(XNamespace.Xml + "lang", "en"),
                new XElement("AccessLicenseNumber", "LICENCE"),
                new XElement("UserId", "USERID"),
                new XElement("Password", "PASSWORD")));

        //Shipping request:
        var serviceXML = new XDocument(    
            new XDeclaration("1.0", "utf-8", "yes"),
            new XElement("RatingServiceSelectionRequest",
            new XAttribute(XNamespace.Xml + "lang", "en"),
            new XElement("Request",
                new XElement("TransactionReference",
                    new XElement("CustomerContext", "Rating and Service"),
                    new XElement("XpciVersion", "1.0001")),
                new XElement("RequestAction", "Rate"),
                new XElement("RequestOption", "Rate")),

                new XElement("PickupType",
                    new XElement("Code", "01"),
                    new XElement("Description", "Daily Pickup")),

                new XElement("Shipment",
                    new XElement("Shipper",
                        new XElement("Address",
                            new XElement("PostalCode", "33706"),
                            new XElement("CountryCode", "US"))),

                    new XElement("ShipTo",
                        new XElement("Address",
                            new XElement("PostalCode", "34221"), //GET from postObject
                            new XElement("CountryCode", "US"))), //GET from postObject

                    new XElement("ShipFrom",
                        new XElement("Address",
                            new XElement("PostalCode", "33706"),
                            new XElement("CountryCode", "US"))),

                    new XElement("Service",
                        new XElement("Code", "03")), //GET from postObject

                    new XElement("Package",
                        new XElement("PackagingType",
                            new XElement("Code", "02")),

                        new XElement("Dimensions",
                            new XElement("UnitOfMeasurement",
                                new XElement("Code", "IN")),
                            new XElement("Length", "20"),
                            new XElement("Width", "20"),
                            new XElement("Height", "20")),

                        new XElement("PackageWeight",
                            new XElement("UnitOfMeasurement",
                                new XElement("Code", "LBS")),
                            new XElement("Weight", "10")))))); //GET from postObject



        //Combine the strings and POST
        var requestXml = accessXML.ToString() + serviceXML.ToString();

现在一切正常。