因为特殊字符导致调用WebService 失败,XML 文档(1014, 6250)中有错误。

问题:

比较老的WinForm程序,使用WebService访问数据。今天突然报错【其他信息: XML 文档(1014, 6250)中有错误。】

解决思路:

        之前用着一直都没有问题,知道应该不是程序本身出了什么问题。跟断点调试发现WebService可以正常访问和返回数据,由此可以判断是因为WebService将数据序列化为XML时没有成功,于是想着自己手动序列化一下看看问题出在哪里。

       百度了一个数据对象转XML的代码:

// 1. 首先要创建或者得到一个数据对象
Order order = GetOrderById(123);


// 2. 用序列化的方法生成XML
string xml = XmlHelper.XmlSerialize(order, Encoding.UTF8);


// 3. 从XML读取数据并生成对象
Order order2 = XmlHelper.XmlDeserialize<Order>(xml, Encoding.UTF8);

XmlHelper是一个工具类。转发地址 https://www.cnblogs.com/fish-li/archive/2013/05/05/3061816.html#_label0

        转换时报错【{"“\u001f”(十六进制值 0x1F)是无效的字符。"}】,看来特殊字符“\u001f”就是这个原因导致的了。

解决办法:

由于返回的是数据集,再加上使用linq获取数据时一些函数无法使用,便出此下策:获取数据后遍历替换特殊字符

网上找了很多都没用,goole 了一篇文章 https://www.thinbug.com/q/6728329,一句代码解决问题。

重点是这一句:item.Vocation.Replace((char)(0x1F), ' ');

foreach(var item in data)
{
    if (!string.IsNullOrEmpty(item.Vocation))
    {
        if (item.Vocation.IndexOf((char)(0x1F)) >= 0)
        {
            item.Vocation= item.Vocation.Replace((char)(0x1F), ' ');
        }
    }
}

后记: 

1、软件开发时一定要控制输入,验证数据的有效性,避免以后踩坑。

2、经过查找发现“\u001f”在数据库中为 “-”,当“-”和中文在一起时linq查询数据时将“-”转为“\u001f”,原因还没查到。

3、既然已经知道是哪个字符搞的鬼了综合 后记 2 可以直接在linq中这么写,效率直接提升一大截。为什么一开始没想到呢

  var result = from pers in db.DA_PersBasicInfo
               join dept in db.DA_Department
               on pers.DeptID equals dept.DeptID into u
               from uc in u.DefaultIfEmpty()
               where 1 == 1
               select new PersDeptModel
               {
                    PerName= pers.A0100,
                    IDCard= pers.A0101,
                    Vocation= pers.Vocation.Replace("\u001f", ""),
                    Sex= pers.Sex,
                    DeptName = uc.DeptName,
                    Spell = pers.Spell,
                    DeptID = pers.DeptID
                };

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值