附录一:数据格式
Supcan TreeList、Freeform、Report的外观样式都是由一个XML或JSON文件来描述的,加载的数据则支持XML、JSON、和TSV文本格式,Report的临时数据源还支持HTML格式。
Supcan内置了一个性能极为出色的XML/JSON/HTML解析器。考虑到程序员通常是手工编辑Treelist、Freeform的模板描述文件,难免出错,所以该解析器的另一特色
就是能够解析出不太规范的粗放型XML、JSON文件, 比如对XML的大小写不敏感、对JSON的单引号双引号不敏感、甚至无引号也能正确解析。
当然,你不能粗犷得太离谱.
无论是XML或JSON描述文件,还是加载的XML、JSON数据,解析器是根据内容自适应的。也就是说,格式和文件(或URL)的后缀没有关系,比如,http://localhost/ack.xml 返回
了JSON数据、http://localhost/ack.json 返回的是XML数据,解析器均能自动识别。
1.XML
Supcan Treelist加载的数据、Report数据源加载的XML数据,格式比较简单,例如:
<?xml version="1.0" encoding="utf-8"?>
<DataRoot>
<Record>
<OrderID>10248</OrderID>
<CustomerID>VINET</CustomerID>
<Freight>1,232.38</Freight>
</Record>
<Record>
<OrderID>10249</OrderID>
<CustomerID>TOMSP</CustomerID>
<Freight>11.60</Freight>
</Record>
...(略)
</DataRoot>
元素<DataRoot>、<Record>的命名是任意的,不一定要写成DataRoot、Record.
Supcan Treelist、Freeform、Report有固定的XML/JSON语法规则,请参见顶部tab的"Treelist XML文档规范"、"Freeform XML文档规范",Report没有公开文档规范是因为
Report本身就是编辑器,不需要手工书写XML/JSON文件.
Supcan Treelist、Freeform 的XML格式规范看上去复杂,其实并不复杂,尤其是Treelist,例如:
<?xml version="1.0" encoding="utf-8"?>
<TreeList>
<Properties Title="订单明细表"></Properties>
<Cols>
<Col name="OrderID" width="70" align="center">订单号|Order ID</Col>
<Col name="CustomerID" width="70">客户号|CustomerID</Col>
<Col name="Freight" width="100" datatype="double">货重|Freight</Col>
</Cols>
</TreeList>
规范中的大部分属性都不需要书写,因为不写就是自动采用默认。在演示包的Treelist子目录下有大量的模板文件,请自行参考。
对粗放型的XML文件的支持表现在如下几个方面:
1.大小写不敏感,例如:
片段 | 标准解析器 | Supcan解析器 |
<CustomerID>abcde</customerid> |  |  |
2.不带引号,例如:
片段 | 标准解析器 | Supcan解析器 |
<Properties title="物资清单"></Properties> |  |  |
<Properties title=物资清单></Properties> |  |  |
3.未转义:
片段 | 标准解析器 | Supcan解析器 |
<Properties title="John&Sam"></Properties> |  |  |
<Properties title="John&Sam"></Properties> |  |  |
2.JSON
Supcan Treelist加载的数据、Report数据源加载的JSON数据,格式比较简单,例如:
{"Record": [
{"Country":"Austria","OrderID":"10258","CustomerID":"ERNSH","OrderDate":"2006.07.17"},
{"Country":"Austria","OrderID":"10263","CustomerID":"ERNSH","OrderDate":null},
{"Country":"Austria","OrderID":"10747","CustomerID":"PICCO","OrderDate":"2007.11.19"},
...(略)
]}
对象名不一定是"Record",你可以任意命名.
日期支持类似"\/Date(783643765+0800)\/"的格式; 中文支持类似"\u0f88\u44f0"的格式.
也可以写成这样:
[
{"Country":"Austria","OrderID":"10258","CustomerID":"ERNSH","OrderDate":"2006.07.17"},
{"Country":"Austria","OrderID":"10263","CustomerID":"ERNSH","OrderDate":null},
{"Country":"Austria","OrderID":"10747","CustomerID":"PICCO","OrderDate":"2007.11.19"},
...(略)
]
Supcan Treelist、Freeform、Report的模板描述文件和数据,均是既支持XML格式、也支持JSON格式.
例如上例Treelist的XML串,用JSON来表示,就是:
{
"TreeList": {
"Properties": {"Title":"订单明细表"},
"Cols": [
{"name":"Country", "width":100, "text":"国家|Country"},
{"name":"OrderID", "width":70, "align":"center", "text":"订单号|OrderID"},
{"name":"CustomerID", "width":70, "text":"客户号|CustomerID"},
]
}
}
XML中的 <Col>国家</Col> 中的"国家"是用 { "text":"国家" } 来代替的。
对粗放型的JSON文件的支持,主要表现在对引号不敏感,例如:
片段 | 标准解析器 | Supcan解析器 |
{ "align": "left" } |  |  |
{ align: "left" } |  |  |
{ "align": left } |  |  |
{ align: left } |  |  |
{ 'align': 'left' } | 不一定 |  |
当然,引号必须配对,比如下面的片段Supcan解析器也无法解析:
片段 | 标准解析器 | Supcan解析器 |
{ "align": "left' } |  |  |
此外,Supcan解析器也允许正斜杠不转义:
片段 | 标准解析器 | Supcan解析器 |
{ "dataURL": "http:\/\/localhost\/index.aspx" } |  |  |
{ "dataURL": "http://localhost/index.aspx" } | 不一定 |  |
3.TSV
TSV格式只能用作数据格式,不能用来描述模板文件.
TSV格式是不含列信息的纯文本,类似二维的平面结果集,也无法表达树结构。
TSV即 Tab-Seperated Value,以Tab分隔列、回车分隔行 (在C#、Java、js中,Tab是"\t",回车是"\r\n"),所以其废码特别少,耗用的网络流量比XML和JSON都要小得多.
TSV规则简单,转义规则为:
1.如果值串中本身就包含Tab符或回车符,那么请用双引号包绕这个值;
2.如果值串中本身就包含了双引号,那么请用连续2个双引号代替之、再用双引号包绕这个串.