通过正则表达式过滤/去除 XML 1.0 的非法字符

说明:
XML 1.0 的合法字符如下:

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

例如,.NET 框架中的 SQLDataAdapter.Fill() 将自动将 XML 1.0 不支持的 Unicode 字符转换为 HTML 字符(如 #xB 等),因此,在这类场景中,应当首先过滤非法字符,否则 XSL 等可能会无法正确处理由 XmlDocument.LoadXml() 得到的 XML。
另,改用 XML 1.1 也是一种解决方案,XML 1.1 的非法字符仅有 NUL (x00)、xFFFE 与 xFFFF 这三个。

用于匹配 XML 1.0 非法字符的正则表达式模式如下:

VB.NET 代码示例:

SOAP 与 REST 简单比较

SOAP
SOAP是一种协议。
SOAP是Simple Object Access Protocol的缩写,用于传输小规模数据。SOAP消息为XML格式,通常以HTTP协议发送(亦通过TCP/IP)。
由于采用了XML格式,SOAP需要定义数据的类型与功能。如果要传输二进制数据,则必须先以base64格式对其编码。WSDL、XSDs、WS-Addressing等协议或技术都与之相关。
SOAP由于可以同时控制服务器与客户端的行为,因此经常被用于内部网络API。

REST
REST是一种传输架构,与协议无关。
REST是Representational State Transfer的缩写,可以较为灵活地在客户端与服务器之间传输数据,格式可以是JSON、XML甚至纯文本,机制较SOAP更为轻量。
REST采用通常的HTTP方法(如HTTP GET、HTTP PUT等)传输,而无需借助XML。只要框架支持HTTP,就能实现REST。二进制数据也可以通过请求传输。不过需要注意,REST并没有与CRUD方法一一对应。
REST由于简单轻量,且格式更为灵活,不少公网API都采用了这种方式。

在选择SOAP还是REST时,可以考虑以下几点:

REST的优势:

  • 实现简单
  • 学习曲线平缓
  • 传输效率更高(无需定义XML)
  • 传输速度更快(没有引入额外的处理)
  • 与其他一些网络技术在设计理念上有共通之处

REST的劣势:

  • 是否需要独立于平台、框架或协议(REST依赖HTTP)
  • 是否需要在分布式企业环境中运作(REST是直接的点对点通信)
  • 是否需要限定传输格式
  • 是否需要使用WS标准提供的扩展功能(如项目已有的代码或接口)
  • 是否需要利用内建的错误处理机制
  • 是否希望利用语言或框架自带的自动化机制来创建接口

.NET 开发笔记

作为分类目录的一个补充,在这里按照功能类别对 .NET 开发中的一点心得和笔记作一个索引。其中部分是根据自己在查找网络资料时找到的内容的整理与演绎,在此感谢所有那些无私分享经验的人们。

Entity Framework

Web

.NET 中 Entity Framework 的数据库查询

Entity Framework 支持三种类型的数据库查询。

  • LINQ to Entities
  • Entity SQL
  • Native SQL

其中,LINQ(音:link)是较为推荐的方式。它又分为 LINQ Method syntax 与 LINQ Query syntax,如下所示。

Entity SQL 与 Native SQL 都是基于拼接 SQL 语句的方式,如下所示。

此外,Entity Framework 提供了丰富的函数,应了解并掌握用法。以下列举一些。

  • Aggregate*
  • Average
  • All
  • Any
  • ElementAt/ElementAtOrDefault*
  • Single/SingleOrDefault*
  • Contains
  • First/FirstOrDefault/Last/LastOrDefault*
  • Count
  • Max/Min*
  • OrderBy/OrderByDescending
  • Reverse
  • SelectMany
  • SequenceEqual
  • Skip/SkipWhile
  • Take/TakeWhile

其中以星号标记的将返回 Entity 实体。