### 附录一：数据格式

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&amp;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个双引号代替之、再用双引号包绕这个串.
硕正树列表、报表中有这方面的应用例子，数据文件请参考：data.txt
4.TSV-Ex

TSV-Ex 是硕正定义的格式，并非国际标准。它改良了TSV的不足：缺少列信息，要求数据中的列和表格的列顺序完全对应，这会导致开发困难。
TSV-Ex 格式只是在 TSV 数据的上方增加了几行文本标识头，里面可以包含列名，格式举例如下：
[tsv-ex]
[name]Country　　OrderID　　CustomerID　　OrderDate　　RequiredDate　　Freight　　ShipName　　ShipCity
[/tsv-ex]
上方暗红部分是固定的识别串，蓝色文字就是列名(字段名), 以制表符(\t)分隔，它表示了下方数据的列顺序.
增加了列名后，TSV的使用价值大增，可以方便地用于树列表、报表数据源的结果集数据.
硕正树列表、报表中也有这方面的应用例子，数据文件请参考：data60.tsv-ex.txt
如果要用于分页查询，总页数应该如下方式夹带在标识头中：
[tsv-ex]
[name]Country　　OrderID　　CustomerID　　OrderDate　　RequiredDate　　Freight　　ShipName　　ShipCity
[totalRows]3990
[/tsv-ex]
如果将 TSV-Ex 格式应用于报表的数据源，在设计时还可以包含字段含义、数据类型，以方便报表导入格式：
[tsv-ex]
[name]Country　　OrderID　　CustomerID　　OrderDate　　RequiredDate　　Freight　　ShipName　　ShipCity
[title]国家　　订单号　　客户号　　订单日期　　发货日期　　货重　　船名　　目的地
[datatype]string　　string　　string　　date　　date　　double　　string　　string
[/tsv-ex]
字段标题之间、字段类型之间均以制表符(\t)分隔的。

标识符 (即 [..] 中的串) 大小写不敏感.

里面回车符不可省略, 包括最后(头部结尾处)的回车符.