我们正在努力将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 )
,我现在对这种创可贴感觉更舒服。
答案 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 +)… 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 +)… 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>