使用“&”读取XML到C#XMLDocument对象

前端之家收集整理的这篇文章主要介绍了使用“&”读取XML到C#XMLDocument对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我继承了一个写得不好的Web应用程序,当它尝试读入存储在数据库中的一个“&”在里面。例如,将会有一个包含内容标签:“Prepaid& Charge”。有没有一些秘密的简单的事情要做,它没有得到一个错误解析该字符,或者我缺少一些明显的东西?

编辑:
是否有任何其他字符会导致相同类型的解析器错误不正确形成?

问题是xml格式不正确。正确生成的xml会列出这样的数据:

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方法更容易。

猜你在找的XML相关文章