编辑:
是否有任何其他字符会导致相同类型的解析器错误不正确形成?
Prepaid & Charge
我之前不得不解决同样的问题,我用这个正则表达式来做:
Regex badAmpersand = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)");
结合一个定义如下的字符串常量:
const string goodAmpersand = "&";
现在你可以说badAmpersand.Replace(<你的输入> goodAmpersand);
请注意,一个简单的String.Replace(“&”,“& amp;”)不够好,因为您不能提前知道给定的文档是否有&字符将被正确编码,错误地编码,甚至两者都在同一文档中。
这里的抓取是,您必须在将其加载到解析器之前将其完成到您的xml文档,这可能意味着额外的通过它。此外,它不考虑CDATA部分内的&符号。最后,它只捕获&符号,而不是其他非法字符,如<。更新:基于注释,我还需要更新十六进制代码(& #x ...;)实体的表达式。 关于哪些字符可能引起问题,实际规则有点复杂。例如,数据中允许某些字符,但不能作为元素名称的第一个字母。而且没有简单的非法字符列表。相反,一个大(不连续)的UNICODE条纹是defined as legal,任何外面都是非法的。
所以当它归结到它时,你必须相信你的文件来源至少具有一定的合规性和一致性。例如,我发现人们通常都很聪明,可以确保标签正常工作并逃脱,即使他们不知道&是不允许的,因此今天你的问题。然而,最好的事情是把这个固定在源头上。
哦,和关于CDATA建议的一个注意事项:我会用它来确保我创建的xml是格式正确的,但是当从外部处理现有的xml时,我发现regex方法更容易。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。