2013-02-13 91 views
2

我遇到一个问题,如果我传递一个硬编码字符串\x1B|200uF作为参数,该命令会正确接受它。字符串中的转义序列

但是,当我检索XML元素相同的值到一个新的字符串变量,我得到以下值:\\x1B|200uF

正如你可以看到有一个额外的转义序列。

因此,在总结问题:

using (XmlReader xmlReader = XmlReader.Create(@"PosPrinter.xml")) 
       {  
        while (xmlReader.Read()) 
        { 
         if (xmlReader.NodeType == XmlNodeType.Element) 
         { 
          switch (xmlReader.Name) 
          { 
           case "PosPrinter": 
            _printer.LogicalName = xmlReader.GetAttribute("LogicalName"); 
            break; 

           case "FeedReceiptCommand": 
            _printer.FeedReceiptCommand = xmlReader.GetAttribute("value"); 
            break; 

我值检索到我的“FeedReceiptCommand”字符串正如我上面提到的值存储在XML作为\x1B|200uF但检索到的字符串作为\\x1B|200uF与在开始时额外的转义序列。

我然后使用字符串变量FeedReceiptCommand打电话给我的命令:

_posPrinter.PrintNormal(PrinterStation.Receipt, PrinterSettings.FeedReceiptCommand); 

但由于额外的转义序列的命令不执行。

但如果我叫用值相同的命令硬编码:

_posPrinter.PrintNormal(PrinterStation.Receipt, "\x1B|200uF"); 

...然后命令被成功执行..

价值\x1B|200uF是ESC命令使用Microsoft.PointOfService发送给Epson TM-T88V打印机,其中'\ x'是用于Hex的,我认为1B是Hex值。

我hav e试图通过使用'Trim','Substring',甚至做一个foreach循环来循环字符串中的每个字符以建立一个新字符串来摆脱额外的转义序列。我也尝试过stringbuilder。

但我错过了这里的某处。

因此,任何帮助会中我如何在地方\x1B|200uF

+1

您能得到什么,如果你打印出价值?我确信''''只是一个显示器。 – ChrisF 2013-02-13 23:04:56

回答

3

确实存在于XML文件中的问题在于(如@OlafDietsche指出的那样)。在C#字符串中,\ x1B表示“代码为1B(十六进制)或27(十进制)”的字符,在XML中,它只是四个字符。

所以你必须以不同的方式在XML文档中编码特殊字符。理论上,您只需用替换\ x1B,这是说“字符编号1B(十六进制)”的XML方式。然而,在这种特定情况下,问题是在XML中是不允许的。 XML文档中的有效字符在此定义:http://www.w3.org/TR/xml/#charsets 请注意#x1B不在此范围内。

您可以使用不同字符来表示XML中的Escape并将其替换为您的C#代码。确保使用代理字符a)是有效的XML字符,b)永远不会用作实际数据。

例如,选择xFEED作为您的转义字符(因为它很容易识别)。所以,你的文件看起来像:

<FeedReceiptCommand value="&#xFEED;|200uF"/> 

在你的C#代码,因此替换它:

string actualValue = reader.GetAttribute("value").Replace('\xFEED', '\x1B') 
+0

感谢Andre(&@OlafDietsche)为您提供的输入和时间来了解我的问题。安德烈表示,该方法效果很好。 +1再次感谢:) – Kev 2013-02-14 10:31:13

1

传递一个变量在硬编码字符串可以理解的,你有字符的十六进制1BESC加上字符串|200uF。我没有看到你的XML,但我猜想在XML中,字面意思是字符串\x1B,它是四个字符\,x,1B

这就是硬编码和XML之间的区别。

AFAIK,在XML 1.0文档中没有办法将控制字符字面地包含为ESC。如果你的XML解析器没有正确传递它,你可以尝试将它编码为&#x001B;并自己解析它。

+0

感谢Olaf抽出时间添加您的输入信息..非常感谢:) +1 – Kev 2013-02-14 10:32:07