需要在XML字符串中删除非法字符

10 浏览
0 Comments

需要在XML字符串中删除非法字符

我需要在C#中处理XML数据,然而有时候会出现非法的XML字符。

例如,以下XML代码将无法解析,因为它是无效的:

写心形的另一种方式是<3

XML解析器会抛出错误,因为它是无效的,这是有道理的。

尽管如此,我似乎找不到一种只替换那个"<"为"& lt;"的方法,以便解析器接收到:

写心形的另一种方式是<3

注:它可能出现在XML的任何节点中,该节点本身可能非常大,并且像我之前说的,这种情况并不总是发生...

有没有一个可以处理这个问题的函数?

0
0 Comments

在XML字符串中出现非法字符的问题,没有一个通用的解决方案,因为你无法确定以下情况是否是一个“错误”并且实际上应该被编码:

You can use  to highlight stuff in HTML..

或者不应该被编码:

You can use <b></b> to highlight stuff in HTML..

因此,由于没有通用的解决方案,你只能使用不完美的启发式方法来检测此类问题。

在C# BCL中没有内置的启发式方法,你需要自己编写或找到一些外部库。一个简单的启发式方法是查找所有不以<后面跟着[/a-zA-Z0-9]+>的字符,并对它们进行转义。

启发式方法本质上是不完美的,因此如果你有机会修复创建这些破损看起来像XML但实际上不是的文件的系统,这将是一个更好的解决方案。

这是我用来解决问题的答案,我可以使用以下正则表达式来匹配错误的XML字符:<(?![/a-zA-Z0-9]+>),当我遇到其他情况时,我会添加更多的表达式...谢谢!

扩展正则表达式以匹配<these_tags>: <(?![/a-zA-Z0-9]*[_/a-zA-Z0-9]*>)。

[/a-zA-Z0-9]*[_/a-zA-Z0-9]*在语义上等同于[_/a-zA-Z0-9]*

不,它们并不相同。前者限制了下划线不能出现在第一个位置,而后者没有限制。

如果第一个量词是+(或者缺失)而不是*,它将生效。目前,_abc是一个有效的匹配,它由第一个字符组出现0次和第二个字符组出现4次组成。

0
0 Comments

在这篇文章中,问题是如何从XML字符串中删除非法字符。首先,文章介绍了一个方法来删除无效的XML字符,即使用XmlConvert.IsXmlChar方法。然后,给出了一个代码示例来演示如何使用这个方法。代码示例中,首先定义了一个字符串content,其中包含了一些无效的XML字符。然后,通过调用RemoveInvalidXmlChars方法来删除这些无效字符,并将结果赋给content变量。最后,通过调用IsValidXmlString方法来验证删除无效字符后的字符串是否为有效的XML字符串。

接下来,文章介绍了另一种方法来转义无效的XML字符,即使用XmlConvert.EncodeName方法。同样给出了一个代码示例来演示如何使用这个方法。代码示例中,首先定义了一个常量字符串content,其中包含了一些无效的XML字符。然后,通过调用XmlConvert.EncodeName方法将content字符串进行转义,并将结果赋给encoded变量。接着,通过调用IsValidXmlString方法来验证转义后的字符串是否为有效的XML字符串。最后,通过调用XmlConvert.DecodeName方法将转义后的字符串进行解码,并将结果赋给decoded变量。最后,通过比较content和decoded的值来验证解码是否成功。

最后,文章更新中指出,编码操作会产生一个长度大于或等于源字符串长度的字符串。这一点在将编码后的字符串存储在具有长度限制的字符串列的数据库中并验证源字符串长度以适应数据列限制时可能很重要。

这篇文章对于从XML字符串中删除非法字符提供了两种方法:一种是使用XmlConvert.IsXmlChar方法删除无效字符,另一种是使用XmlConvert.EncodeName方法转义无效字符。同时还提到了对于编码操作产生的字符串长度的注意事项。

0
0 Comments

需要在XML字符串中删除非法字符

在处理XML字符串时,有时会遇到非法字符的问题。非法字符是指在XML文档中不被允许出现的特殊字符,例如"<", ">", "&"等。如果XML字符串中包含非法字符,将无法被解析和处理。

解决这个问题的方法是使用正则表达式来修复XML字符串。上面提供的链接中给出了一个使用正则表达式修复XML字符串的代码示例。代码中使用了Java中的Pattern和Matcher类来匹配并修复XML字符串中的非法字符。

代码中的正则表达式是这样的:"(<attribute name=\"[^\"]+\">)(.*?)(</attribute>)",它匹配了XML字符串中的""标签以及其内部的内容。在代码中,使用了StringEscapeUtils类的escapeXml方法来对匹配到的内容进行转义,将其中的非法字符替换为合法的字符。然后,使用Matcher类的appendReplacement方法将修复后的内容替换回XML字符串中的原始位置。最后,使用appendTail方法将剩余的内容追加到修复后的字符串中,并返回修复后的XML字符串。

需要注意的是,根据XML字符串的大小,性能可能会成为一个问题。但是根据目前的知识,没有解析器可以读取带有非法字符的XML并将其删除。

对于包含非法字符的XML字符串,可以使用正则表达式来修复它们。上述提供的代码示例演示了如何使用正则表达式和Java中的Pattern和Matcher类来修复XML字符串中的非法字符。这种方法可以解决XML字符串中的非法字符问题,使其能够被正常解析和处理。

0