在C#中,如何使用特殊字符正确编码QBXML请求

时间:2018-06-16 15:56:37

标签: c# qbxml

我们正在努力将QBXML与我们的应用程序集成,直到今天我们尝试使用WebConnector创建新的NonInventoryItemPart时,所有这些工作都很顺利。以下是我们发送的XML

<?xml version="1.0"?>
<?qbxml version="10.0"?>
<QBXML>
    <QBXMLMsgsRq onError="continueOnError">
        <ItemNonInventoryAddRq requestID="5468-22415">
            <ItemNonInventoryAdd>
                <Name>C-1531</Name>
                <IsActive>false</IsActive>
                <SalesAndPurchase>
                    <SalesDesc>Sumo Rucsac (225 lb +)… Single</SalesDesc>
                    <IncomeAccountRef>
                        <FullName>P/A - Over the Counter</FullName>
                    </IncomeAccountRef>
                    <ExpenseAccountRef>
                        <FullName>C/S P/A - Over the Counter</FullName>
                    </ExpenseAccountRef>
                </SalesAndPurchase>
            </ItemNonInventoryAdd>
        </ItemNonInventoryAddRq>
    </QBXMLMsgsRq>
</QBXML>

连接日志中的响应是众所周知的

错误消息
0x80040400 :QuickBooks found an error when parsing the provided XML text

经过一些试验和错误以及互联网搜索,SalesDesc内部文本是导致错误的原因,特别是(我认为)加号。如果我们将SalesDesc内部文本更改为Sumo Rucsac 225 lb Single,则会成功创建此项目。

在C#中,我们需要能够正确编码请求,以便在出现其他不可接受的字符时,我们可以适当地处理它们。但是,我找不到有关接受哪些字符(编码)的确切细节,也没有找到使用哪种类型的编码,因此我们将来会更加防弹(例如UrlEncoding,HtmlEncoding ...自定义函数?)。我可以保留一个要删除的字符列表,但这似乎会导致维护噩梦。

编辑 - 感谢下面的@Amy,问题缩小到...。对于临时修复,我们使用item.Name.Replace("...", "..");生成项目的内部文本。我仍然认为我们需要更强大的角色处理能力,但由于它不是+ or ( or ),我现在对这种创可贴感觉更舒服。

1 个答案:

答案 0 :(得分:0)

即使您指定utf8编码,QuickBooks SDK也无法处理special characters very well。有时您可以转义字符以使其导入:

<?xml version="1.0"?>
<?qbxml version="10.0"?>
<QBXML>
    <QBXMLMsgsRq onError="continueOnError">
        <ItemNonInventoryAddRq requestID="5468-22415">
            <ItemNonInventoryAdd>
                <Name>C-1531</Name>
                <IsActive>false</IsActive>
                <SalesAndPurchase>
                    <SalesDesc>Sumo Rucsac (225 lb +)&#8230; Single</SalesDesc>
                    <IncomeAccountRef>
                        <FullName>P/A - Over the Counter</FullName>
                    </IncomeAccountRef>
                    <ExpenseAccountRef>
                        <FullName>C/S P/A - Over the Counter</FullName>
                    </ExpenseAccountRef>
                </SalesAndPurchase>
            </ItemNonInventoryAdd>
        </ItemNonInventoryAddRq>
    </QBXMLMsgsRq>
</QBXML>

该响应将不会显示正确编码的字符,但在QuickBooks中会正确显示:

<?xml version="1.0" ?>
<QBXML>
   <QBXMLMsgsRs>
      <ItemNonInventoryAddRs requestID="5468-22415" statusCode="0" statusSeverity="Info" statusMessage="Status OK">
         <ItemNonInventoryRet>
            <ListID>80000005-1530119757</ListID>
            <TimeCreated>2018-06-27T13:15:57-05:00</TimeCreated>
            <TimeModified>2018-06-27T13:15:57-05:00</TimeModified>
            <EditSequence>1530119757</EditSequence>
            <Name>C-1531</Name>
            <FullName>C-1531</FullName>
            <IsActive>false</IsActive>
            <Sublevel>0</Sublevel>
            <SalesAndPurchase>
               <SalesDesc>Sumo Rucsac (225 lb +)&#133; Single</SalesDesc>
               <SalesPrice>0.00</SalesPrice>
               <IncomeAccountRef>
                  <ListID>80000020-1530119204</ListID>
                  <FullName>P/A - Over the Counter</FullName>
               </IncomeAccountRef>
               <PurchaseCost>0.00</PurchaseCost>
               <ExpenseAccountRef>
                  <ListID>80000021-1530119611</ListID>
                  <FullName>C/S P/A - Over the Counter</FullName>
               </ExpenseAccountRef>
            </SalesAndPurchase>
         </ItemNonInventoryRet>
      </ItemNonInventoryAddRs>
   </QBXMLMsgsRs>
</QBXML>