gpt4 book ai didi

c# - 将带有 "&"的 XML 读入 C# XMLDocument 对象

转载 作者:IT王子 更新时间:2023-10-29 04:45:57 26 4
gpt4 key购买 nike

我继承了一个写得不好的 Web 应用程序,当它试图读取存储在数据库中的 xml 文档时似乎有错误,其中有一个“&”。例如,将有一个包含以下内容的标签:“Prepaid & Charge”。是否有一些 secret 的简单事情可以让它在解析该字符时不会出错,或者我是否遗漏了一些明显的东西?

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

最佳答案

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

Prepaid & Charge

我以前解决过同样的问题,我是用这个正则表达式解决的:

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

将它与这样定义的字符串常量结合起来:

const string goodAmpersand = "&";

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

注意一个简单的String.Replace("&", "&amp;")这还不够好,因为您无法提前知道给定文档中的任何 & 字符是否会被正确编码、错误编码,或者甚至在同一文档中两者都被编码。

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

关于哪些字符会导致问题,实际规则有点复杂。例如,某些字符可以出现在数据中,但不能作为元素名称的首字母。并且没有简单的非法字符列表。相反,大片(非连续的)UNICODE 是 defined as legal ,除此之外的任何内容都是非法的。

归根结底,您必须相信您的文档来源至少具有一定的合规性和一致性。例如,我发现人们通常足够聪明,可以确保标签正常工作并转义 <,即使他们不知道 & 是不允许的,因此您今天的问题。但是,最好的办法是从源头上解决这个问题。

哦,关于 CDATA 建议的注意事项:我用它来确保 xml 我正在创建 格式正确,但是当从外部处理现有 xml 时,我发现正则表达式方法更容易。

关于c# - 将带有 "&"的 XML 读入 C# XMLDocument 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/121511/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com