gpt4 book ai didi

c# - 通过在反序列化之前添加预处理步骤,使用 RestSharp 处理 XML 中的无效字符

转载 作者:行者123 更新时间:2023-11-30 21:55:14 25 4
gpt4 key购买 nike

我正在使用 RestSharp 库使用 Web 服务。我对 Web 服务实现没有任何控制权,因为它是第三方(Taleo Business Edition)。

我的问题是存在一些包含无效字符的错误数据。很多数据都是从文档中复制/粘贴的,我不能强制用户返回并清理这些数据。坏字符是不可见的控制代码(0x01),这并没有帮助。

我能想到的唯一解决方案是在 RestSharp 尝试反序列化 XML 之前添加一个预处理步骤。我真的很想避免编写自己的 XML 反序列化器。

我考虑过扩展 XmlSerializer类,但似乎没有任何虚拟方法对于添加此预处理步骤有用。

我还尝试过使用 RestSharp 库中的 OnBeforeDeserializing 事件,但我不知道可以在那里做什么来预处理 XML。

我觉得我在这里错过了一些基本的东西,因为它似乎是使用 RESTful Web 服务的常见用例。

最佳答案

不幸的是使用OnBeforeDeserialization不允许您预处理内容。 Content 都不是或RawBytes当您在此处修改属性时,属性实际上会发生更改。这解释了为什么在尝试清理我的 XML 时,所有正则表达式解决方案似乎都没有任何效果。

为了修改内容,您必须使用自定义 XML 反序列化器。幸运的是,这比我想象的要容易,因为您可以扩展 RestSharp.Deserializers.XmlDeserializer并覆盖 Deserialize<T>方法。然后您可以修改response.Content在将其传递给基本函数之前。


我最终使用的解决方案:

class CustomXmlDeserializer : RestSharp.Deserializers.XmlDeserializer {
public override T Deserialize<T>(IRestResponse response) {
//string pattern = @"&#x((10?|[2-F])FFF[EF]|FDD[0-9A-F]|7F|8[0-46-9A-F]9[0-9A-F])"; // XML 1.0
string pattern = @"#x((10?|[2-F])FFF[EF]|FDD[0-9A-F]|[19][0-9A-F]|7F|8[0-46-9A-F]|0?[1-8BCEF])"; // XML 1.1
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
if (regex.IsMatch(response.Content)) {
response.Content = regex.Replace(response.Content, String.Empty);
}
response.Content = response.Content.Replace("&;", string.Empty);

return base.Deserialize<T>(response);
}
}

基于这个答案:https://stackoverflow.com/a/8331749/201021


我的主要问题是文档中存在大量无效的 xml 实体。我从未见过任何实际无效的控制代码字符。但我有很多像 &#x0; 这样的东西和&#x4诸如此类的事情。这意味着我无法使用仅转义特定字符值的解决方案。

当我尝试在 OnBeforeDeserialize 中使用上面的正则表达式时它似乎根本不起作用。问题实际上不在于正则表达式,而在于您无法修改 Content那里有属性(property)。

此解决方案对其他人来说可能过于本地化,但您应该能够修改此处的预处理代码以获得您需要的结果。

关于c# - 通过在反序列化之前添加预处理步骤,使用 RestSharp 处理 XML 中的无效字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32469961/

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