gpt4 book ai didi

c# - 在构建使用数据的 XmlReader 或 XPathDocument 之前,如何从基于 XML 的数据源中删除无效的十六进制字符?

转载 作者:IT王子 更新时间:2023-10-29 03:40:40 25 4
gpt4 key购买 nike

在 XmlReader 中使用基于 XML 的数据源之前,是否有任何简单/通用的方法来清理它,以便我可以优雅地使用不符合 XML 十六进制字符限制的 XML 数据?

注意:

  • 解决方案需要处理 XML使用字符的数据源UTF-8 以外的编码,例如经过指定字符编码XML 文档声明。不是修改字符编码剥离无效时的来源十六进制字符一直是主要症结所在。
  • 删除无效的十六进制字符应该只删除十六进制编码值,因为您经常会发现数据中的 href 值恰好包含一个字符串,该字符串与十六进制字符匹配。

背景:

我需要使用符合特定格式(想想 Atom 或 RSS 提要)的基于 XML 的数据源,但希望能够使用已发布的数据源,其中包含符合 XML 规范的无效十六进制字符。

在 .NET 中,如果您有一个表示 XML 数据源的 Stream,然后尝试使用 XmlReader 和/或 XPathDocument 对其进行解析,则会由于 XML 数据中包含无效的十六进制字符而引发异常。我目前解决此问题的尝试是将 Stream 解析为字符串并使用正则表达式删除和/或替换无效的十六进制字符,但我正在寻找性能更高的解决方案。

最佳答案

可能并不完美(强调是因为人们遗漏了此免责声明),但我在这种情况下所做的如下。您可以调整以与流一起使用。

/// <summary>
/// Removes control characters and other non-UTF-8 characters
/// </summary>
/// <param name="inString">The string to process</param>
/// <returns>A string with no control characters or entities above 0x00FD</returns>
public static string RemoveTroublesomeCharacters(string inString)
{
if (inString == null) return null;

StringBuilder newString = new StringBuilder();
char ch;

for (int i = 0; i < inString.Length; i++)
{

ch = inString[i];
// remove any characters outside the valid UTF-8 range as well as all control characters
// except tabs and new lines
//if ((ch < 0x00FD && ch > 0x001F) || ch == '\t' || ch == '\n' || ch == '\r')
//if using .NET version prior to 4, use above logic
if (XmlConvert.IsXmlChar(ch)) //this method is new in .NET 4
{
newString.Append(ch);
}
}
return newString.ToString();

}

关于c# - 在构建使用数据的 XmlReader 或 XPathDocument 之前,如何从基于 XML 的数据源中删除无效的十六进制字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20762/

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