加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 08:01:39 所属栏目:百科 来源:网络整理
导读:我继承了一个写得不好的Web应用程序,当它尝试读入存储在数据库中的一个“”在里面。例如,将会有一个包含内容的标签:“Prepaid Charge”。有没有一些秘密的简单的事情要做,它没有得到一个错误解析该字符,或者我缺少一些明显的东西? 编辑: 是否有任何其
我继承了一个写得不好的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方法更容易。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读