使用"&"将XML读入C#XMLDocument对象

Rya*_*rin 18 .net c# xml asp.net xmldocument

我继承了一个编写得很糟糕的Web应用程序,当它试图读入存储在数据库中的"&"中的xml文档时似乎有错误.例如,将有一个包含内容的标签:"预付费和费用".是否有一些秘密简单的事情可以让它解析那个角色没有错误,或者我错过了一些明显的东西?

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

Joe*_*orn 40

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

Prepaid & Charge

我以前必须解决同样的问题,我用这个正则表达式做了:

Regex badAmpersand = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)");
Run Code Online (Sandbox Code Playgroud)

将它与定义如下的字符串常量相结合:

const string goodAmpersand = "&";
Run Code Online (Sandbox Code Playgroud)

现在你可以说 badAmpersand.Replace(<your input>, goodAmpersand);

请注意,简单String.Replace("&", "&amp;")不够好,因为您无法事先知道给定文档是否正确,错误地或甚至在同一文档中编码任何&字符.

这里的捕获是你必须将它加载到解析器之前对你的xml文档执行此操作,这可能意味着额外的通过它.此外,它没有考虑CDATA部分内的&符号.最后,它只捕获&符号,而不是其他非法字符,如<. 更新:根据评论,我还需要更新十六进制编码(&#x ...;)实体的表达式.

关于哪些字符可能导致问题,实际规则有点复杂.例如,数据中允许使用某些字符,但不能作为元素名称的第一个字母.而且没有简单的非法字符列表.相反,一个大的(非连续的)UNICODE区被定义为合法的,并且除此之外的任何东西都是非法的.

因此,当涉及到它时,您必须相信您的文档源至少具有一定程度的合规性和一致性.例如,我发现人们通常足够聪明,以确保标签正常工作并逃脱<,即使他们不知道&不允许,因此今天你的问题.但是,最好的方法是在源头修复此问题.

哦,以及关于CDATA建议的说明:我会用它来确保我正在创建的 xml 格式正确,但是当从外部处理现有的xml时,我发现正则表达式方法更容易.