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

在C#中,如何正确地用特殊字符编码QBXML请求,c#,qbxml,C#,Qbxml,我们正在致力于将QBXML与我们的应用程序集成,直到今天,当我们尝试使用WebConnector创建一个新的非入侵临时程序时,一切都运行得非常好。下面是我们发送的XML <?xml version="1.0"?> <?qbxml version="10.0"?> <QBXML> <QBXMLMsgsRq onError="continueOnError"> <ItemNonInventoryAddRq requestI

我们正在致力于将QBXML与我们的应用程序集成,直到今天,当我们尝试使用WebConnector创建一个新的非入侵临时程序时,一切都运行得非常好。下面是我们发送的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>
经过反复试验和互联网搜索,导致错误的是
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 +)&#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>

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 +)&#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>

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 +)&#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>