加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SSAS维度成员中的非法XML字符[转]

发布时间:2020-12-16 04:59:35 所属栏目:百科 来源:网络整理
导读:解决维度成员中的非法 Xml 字符导致的查询错误 问题描述 最近在项目中遇到这么个情况,在展开维度成员的时候,服务端抛出了 "The server sent an unrecognizable response" 的异常,看了下异常细节,给出的 错误信息是 "hexadecimal value 0x01,is an invali

解决维度成员中的非法Xml字符导致的查询错误

问题描述

最近在项目中遇到这么个情况,在展开维度成员的时候,服务端抛出了"The server sent an unrecognizable response"的异常,看了下异常细节,给出的错误信息是"hexadecimal value 0x01,is an invalid character. Line 1,position 6771. (System.Xml)"(十六进制0x01是无效字符,行1,位置6771)

我遇到的真实案例

某项目中,代理商名称中出现了一个多余的内码,导致Analyzer在拖代理商名称时候总是没有数据,而且在做筛选时候报错。

计算机生成了可选文字: 口口难度曰以o.mAgentGeneral国:兰Agentoesc田荟邑Agent10田荟:AgentName国荟邑AgentTv阵困非oty田荟邑GeneralAgen卿田荟邑Province田荟:肋gion国逮产品曰以代理商田兰:代理商名称国兰:代理商描述国兰:代理商类型国兰:代理商编号田器区域田非城市国荟:总代名称________曰_韶_省份________X数据透视表2请将过虑条件维度拖动至、「卜}______1且分折-______争系统讯息月民务器错误:""(+六进制值0x护)是无效的字符。行1,位置53874。}臼、。知系、*管.甲员COmDan.C.r〕O详细技术讯息

问题解决

出现这样问题的原因在于,微软的Analysis Service使用XMLAXML for Analysis)语言和其他客户端进行交互,包括执行

MdxDMXSql等。如果服务端返回的成员(关键列、名字、标题、成员值等)含有一些非打印字符的话,那么就无法直接在Xml

中表示,这样就会导致客户端无法解析返回的Xml响应,而出现上述的错误

Analysis ServiceProcess的时候,出于性能考虑默认情况下是不会对数据进行这种Xml非法字符的检测。不过Analysis Service

提供了一个设置开关,允许我们在处理阶段检测这些非法字符,并做一定的规范化处理。在BIDS中,我们打开维度属性的属性面板

有一个 InvalidXmlCharacters的设置,如下图所示:

默认情况下其值为Preserve,也就是保留这些非法字符。它还有其他两个选项。Remove表示移除这些非法字符,只保留合法

Xml字符。Replace表示使用问号?替换非法字符,一个非法字符对应一个问号。 在实际应用中,InvalidXmlCharacters需要根据

项目的实际情况进行设置。如果对数据的这种清理可以放到ETL阶段,那么最好放到ETL 阶段,因为这样可以加快Analysis Service

理的速度。否则就只能在Process的时候做检测了。对于RemoveReplace,我比较倾向于选择Remove。因为既然已经是非打印字

符了,用问号代替固然能够和其他数据区分开来,但是对于最终用户来说,大部分情况下只会增加他们的迷惑而已。

剔除非法Xml字符

Xml 1.0规范(第五版,06/11/2008)的2.2一节中提到了Xml合法字符的范围:

/* any Unicode character,excluding the surrogate blocks,FFFE,and FFFF. */
Char : : = #x9 | #xA | #xD | [#x20 -#xD7FF] | [#xE000 -#xFFFD] | [#x10000 -#x10FFFF]

规范中建议,所有Xml处理器都应该正确处理上述范围的这些字符。

我们可以在处理字符串的时候使用正则表达式剔除掉非法的Xml字符,以保证最终进入Analysis Service的字符都是Xml合法字符。

[^x09x0Ax0Dx20-uD7FFuE000-uFFFDu10000-u10FFFF]

对应的C#代码如下,出于性能考虑,可以将函数内部的正则表达式存储为成员变量,并设置为预编译模式。

public static String StripInvalidXmlChars(String input)
{
Regex re = new Regex(@ "[^x09x0Ax0Dx20-uD7FFuE000-uFFFDu10000-u10FFFF]");
return re.Replace(input, "");
}



来自为知笔记(Wiz)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读