在XML文档中,除了0x09、0x0a、0x0d即制表符、回车符和换行符之外,任何低于0x20的字符都不能包含。
我有一些数据从数据库中出来,并作为Web服务请求的响应传递。
Soap格式化程序将0x12字符(Ascii 18,设备控制2)愉快地编码为
,但响应在客户端上失败,显示十六进制值0x12是无效字符。
<rant>
我觉得相当令人沮丧的是,这两个方面其实是同一枚硬币的两面,客户端和服务端都是.NET应用程序。如果没有任何东西可以读取,为什么soap格式化程序会写入不良的xml?</rant>
我想要:
- 使Xml Serialiser正确处理这些奇怪的字符;或者
- 让Web服务请求失败
我已经搜索了一些资料,但并没有找到太多信息,只有a)“清理你的输入”或b)“更改你的文档结构”。
a) 很难操作,因为其中一些数据超过20年
b) 也不是一个好的选择,因为除了我们自己的前端之外,我们还有直接针对Web服务编码的客户端。
我是不是漏掉了一些显而易见的东西?还是说只能绕过Ascii控制码编写代码?
谢谢
更新
这实际上是XmlSerialiser的问题,以下代码将向流中序列化无效字符,但不会反序列化它
[Serializable]
public class MyData
{
public string Text { get; set; }
}
class Program
{
public static void Main(string[] args)
{
var myData = new MyData {Text = "hello "
+ ASCIIEncoding.ASCII.GetString(new byte[] { 0x12 })
+ " world"};
var serializer = new XmlSerializer(typeof(MyData));
var xmlWriter = new StringWriter();
serializer.Serialize(xmlWriter, myData);
var xmlReader = new StringReader(xmlWriter.ToString());
var newData = (MyData)serializer.Deserialize(xmlReader); // Exception
// hexadecimal value 0x12, is an invalid character.
}
}
我可以通过显式创建XmlWriter并将其传递给Serialise(我将很快发布自己的答案)来使其在写入xml时出现故障,但这仍然意味着我必须在发送数据之前对其进行清理。
由于这些字符是重要的,我不能只是剥离它们,我需要在传输之前对它们进行编码,读取时进行解码,我非常惊讶的是似乎没有现有的框架方法可以做到这一点。