相关疑难解决方法(0)

如何从之前构建一个使用数据一个XmlReader或XPathDocument的基于XML的数据源中删除无效的十六进制字符?

在XmlReader中使用它之前,是否有任何简单/通用的方法来清理基于XML的数据源,以便我可以优雅地使用不符合XML上的十六进制字符限制的XML数据?

注意:

  • 该解决方案需要处理使用UTF-8以外的字符编码的XML数据源,例如,通过在XML文档声明中指定字符编码.在剥离无效的十六进制字符时,不破坏源的字符编码一直是一个主要的难点.
  • 删除无效的十六进制字符应仅删除十六进制编码值,因为您经常可以在数据中找到碰巧包含字符串的href值,该字符串将是十六进制字符的字符串匹配.

背景:

我需要使用符合特定格式的基于XML的数据源(想想Atom或RSS提要),但希望能够使用已发布的数据源,这些数据源包含符合XML规范的无效十六进制字符.

在.NET中,如果您有一个表示XML数据源的Stream,然后尝试使用XmlReader和/或XPathDocument对其进行解析,则会由于在XML数据中包含无效的十六进制字符而引发异常.我目前解决此问题的尝试是将Stream解析为字符串并使用正则表达式删除和/或替换无效的十六进制字符,但我正在寻找更高性能的解决方案.

c# xml validation encoding

74
推荐指数
6
解决办法
9万
查看次数

在c#中使用Regex将字符串解析为数组

我目前正在制作一个从串口接收字符串的c#应用程序,我需要解析这些数据,以便我可以用它来做任务.

通过它发送的字符串SerialPort格式如下:

*NTF,CTRL,SQL,OPEN,+,-66*NTF,CTRL,DBUSY,ON,+,-63*NTF,CTRL,DBUSY,OFF*NTF,CTRL,SQL,CLOSE*
Run Code Online (Sandbox Code Playgroud)

现在我想知道如何将这个字符串分成*符号上的段,我自己做了几次尝试,但无法弄明白.

我的尝试是:

String[] tmp = data.ToString().Split('*');
foreach(String word in tmp)
{
    if (word.Contains(",80") || word.Contains(",81"))
    {
        COM_PORT_INFO_BOX.Text += word + "\r\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我:

NTF,CTRL,SQL,OPEN,+,-66
NTF,CT RL,DBUSY
,ON,+,-6
3
NTF,CT
RL,DBUSY
,OFF NTF,CT
RL,SQL,C
LOSE
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

var regex = new Regex('*'+".+"+'*');
var matches = regex.Matches(data);
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误.

我想要实现的目标:

格式化的字符串如下所示:

NTF,CTRL,SQL,OPEN,+,-66
NTF,CTRL,DBUSY,ON,+,-63
NTF,CTRL,DBUSY,OFF
NTF,CTRL,SQL,CLOSE
Run Code Online (Sandbox Code Playgroud)

编辑:

我通过这段代码解决了这个问题:

SerialPort sp = (SerialPort)sender;
data += sp.ReadExisting().ToString();
string[] tmp = data.Split(new char[] {'\u0002','\u0003'}, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in tmp) …
Run Code Online (Sandbox Code Playgroud)

c# regex string-parsing

-2
推荐指数
1
解决办法
365
查看次数

标签 统计

c# ×2

encoding ×1

regex ×1

string-parsing ×1

validation ×1

xml ×1