在C#中,如何正确地用特殊字符编码QBXML请求
我们正在致力于将QBXML与我们的应用程序集成,直到今天,当我们尝试使用WebConnector创建一个新的非入侵临时程序时,一切都运行得非常好。下面是我们发送的XML在C#中,如何正确地用特殊字符编码QBXML请求,c#,qbxml,C#,Qbxml,我们正在致力于将QBXML与我们的应用程序集成,直到今天,当我们尝试使用WebConnector创建一个新的非入侵临时程序时,一切都运行得非常好。下面是我们发送的XML <?xml version="1.0"?> <?qbxml version="10.0"?> <QBXML> <QBXMLMsgsRq onError="continueOnError"> <ItemNonInventoryAddRq requestI
<?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>
经过反复试验和互联网搜索,导致错误的是saledesc
内部文本,特别是(我认为)加号。如果我们将saledesc
内部文本更改为Sumo Rucsac 225 lb Single
,则此项目创建成功
在C#中,我们需要能够正确地编码请求,以便在出现其他不可接受的字符时,我们能够适当地处理它们。然而,我找不到任何关于什么字符(编码)被接受的好细节,也找不到确切的编码类型,因此我们在未来更加防弹(例如UrlEncoding、HtmlEncoding…自定义函数?)。我可以维护一个要删除的字符列表,但这似乎会导致维护噩梦
编辑-多亏了下面的@Amy,问题缩小到了
…
。对于临时修复,我们使用item.Name.Replace(“…”,“.”)
生成项目的内部文本。我仍然认为我们需要一个更健壮的字符处理,但由于它不是<代码> +或(或)< /代码>,所以现在我觉得对这个创可贴更舒服。 即使您指定UTF8编码,QuoQuooSK SDK也无法处理。有时,您可以转义字符以将其导入:
<?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>
C-1531
假的
相扑鲁萨克(225磅以上)…;单身
付款交单-柜台付款
C/S P/A-柜台付款
响应将不会显示正确编码的字符,但在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>
80000005-1530119757
2018-06-27T13:15:57-05:00
2018-06-27T13:15:57-05:00
1530119757
C-1531
C-1531
假的
0
相扑鲁萨克(225磅以上)133;单身
0
80000020-1530119204
付款交单-柜台付款
0
80000021-1530119611
C/S P/A-柜台付款
也许可以尝试将其包装在CDATA
元素中?…
看起来可疑。@艾米-谢谢你的输入!我尝试了CDATA标记,但我认为QBXML不太喜欢它。但是…你指向省略号产生了一些好的结果。原来不是括号或加号,而是…
,因为只有将其更改为。
才起到了应有的作用。有趣的是,这些数据来自一个文本文件,所以它不是一个HTML椭圆实体或类似的东西。。。?我猜字符的特定组合有一个特殊的含义,即使它实际上是一行三个句点。我有一个假设:QBXML阅读器没有将XML视为UTF-8。也许可以尝试在XML元素中指定编码?(我不知道QBXML元素)。我没有其他建设性的想法。也许读取QBXML的软件不理解unicode字符串?@Amy-这是另一个好主意。诚然,我在编码和XML方面很弱,所以我正在学习!您是如何创建这个XML的?使用一些支持XML的组件或纯字符串(生成器)?组件将知道如何编码特殊字符。
<?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>