【问题标题】:Non white space characters cannot be added to content with XDocument and UPS API不能使用 XDocument 和 UPS API 将非空白字符添加到内容中
【发布时间】:2016-04-05 15:52:01
【问题描述】:

我正在尝试使用 xDocument 以 xml 格式发送 UPSAPI 请求。但由于某种原因,我在尝试制作 xml 时遇到错误??我得到了错误:

非空白字符不能添加到内容中。

在字符串生成器本身上,而不是在特定区域。所以我不知道它的失败之处。代码如下:

        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>

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

【问题讨论】:

  • 你不能有多个根元素。
  • 为什么不尝试删除 xml 的部分,直到它再次开始运行。这将帮助您缩小导致问题的部分
  • 那么他们需要非法的、毫无意义的 XML,您应该向他们投诉。或者他们只是想要连接两个有效文档,这仍然是错误的。
  • 正如 SLaks 所说,一个 XML 文档必须只有一个根元素。你的会有两个,这是不允许的。见en.wikipedia.org/wiki/Root_element
  • 是的,我现在明白了。我以为这只是声明。但是是的,UPSAPI 两者都需要。所以我必须将它们连接到两个单独的 XDocument 中才能发布到 UPS。我会发布一个答案,我想通了。

标签: c# xml ups


【解决方案1】:

如上所述,XDocument 不允许多个根。但是 UPS shipping 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();

现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多