65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的 WBXML 支持 - Handy

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.21/5 (5投票s)

2007年11月1日

CPOL

2分钟阅读

viewsIcon

39662

downloadIcon

647

用于在 C# 和 CF C# 中处理 WAP 二进制 XML 的开源类

引言

亲爱的读者们,

03 01 6A 00 00 01 41 42 03 57 42 58 4D 4C 20 50 72 6F 67 72 61 6D 6D 
65 72 00 01 43 03 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 00 01 01 

您知道我在说什么吗?上面 45 字节的字符串表示下面 208 字节的 XML

<hello-world> 
<greeter>WBXML Programmer</greeter> 
<greeting>Hello, World!</greeting> 
</hello-world>

背景

基本上,XML 是一种非常简单的语言。它易于理解、解析和使用。然而,XML 在传输方面效率非常低。为了发送这个小的 XML 文件,您不得不传输超过 200 字节,而实际有意义的信息只有两个字符串。当我们在局域网环境中工作时,这并不是一个关键问题。但是,当与移动客户一起工作时,它会变得非常关键。这就是发明 WAP 二进制 XML (或 WBXML) 的原因。

这种语言使用名称表(标记)将节点和属性转换为一个字节值,从而节省了大量不必要的信息传输。WBXML 规范非常简单,但是 .NET(甚至是 Compact)框架缺乏对 XmlDocument 的支持,无法处理这种内容格式。

它足够常见,值得学习和使用吗?嗯,这是一个棘手的问题。一方面,所有移动内容提供商(甚至那些处理移动同步的提供商)广泛使用这种格式。另一方面,如果您不真正涉足“移动”(或任何其他带宽效率)编程,您就不需要它。

我认为在编程(总的来说)中最重要的事情之一就是效率,所以我决定编写一个派生自 XmlDocument 的类来提供 WBXML 支持。

Using the Code

首先创建名称表(如果您只使用一个标记,则无需这样做)

Dictionary<int, Dictionary<byte, string>> tokens = 
	new Dictionary<int, Dictionary<byte, string>>(); 

Dictionary<byte, string> token = new Dictionary<byte, string>(); 
token.Add(1, "hello-world"); 
token.Add(2, "greeter"); 
token.Add(3, "greeting"); 

tokens.Add(1, token);

然后用这些表创建一个 new WBXmlDocument 实例

System.Xml.WBXmlDocument doc = new System.Xml.WBXmlDocument(tokens);

现在您可以使用它,就像一个普通的 XmlDocument...

doc.LoadXml("<hello-world><greeter>WBXML Programmer</greeter>
	<greeting>Hello, World!</greeting></hello-world>");

... 然后创建它的二进制表示

byte[] bytes = doc.GetBytes();

或者加载传入的字节数组...

doc.Load(bytes);

... 并获得您的 XmlDocument

string xml = doc.DocumentElement.OuterXml;

就是这样。很简单,不是吗?

关注点

WBXML 在 VB.NET 中的其他实现可以在 CodeProject 这里找到。

Notice

  • 这不是最终版本。
  • 它还没有经过充分的测试。
  • 属性解析存在已知问题。
  • 它没有实现完整的规范(我是根据我自己的需求实现的)。
  • 每个公司可能有自己的协议,可能与官方规范略有不同(例如 SyncML)。
  • 只有在您获得目标协议的完整规范时,您才能知道标记表。私有标记不会根据协议传输。

有关此代码许可和使用条款的更多信息可以在我的博客中找到

历史

  • 2007 年 11 月 1 日:初始发布

© . All rights reserved.