使用 XML 和 ASP 处理财务数据






1.56/5 (6投票s)
2004 年 11 月 16 日
13分钟阅读

50785
使用 XML 和 ASP 对资产负债表进行财务分析
引言
今天我将讨论如何利用 XML 技术来简化财务文档的电子通信。公司的财务文档通常以资产负债表、损益表、现金流量表等形式呈现。这些不同部分的财务报表必须符合巴基斯坦证券交易委员会 (Securities and Exchange Commission (Pakistan)) 或公认会计原则 (GAAP) 确立的准则。由于财务文档(大多数情况下)能很好地契合到明确定义的模板中,因此一家公司的一份财务文档很容易被其他公司、股东或任何感兴趣的个人所利用。然而,在电子传输此类文档方面,却不存在这样的标准化。尽管已经存在相关的技术——最著名的是金融信息交换标记语言 (Financial Information Exchange Markup Language)——但它们尚未标准化。此外,还不存在能够处理这些格式的通用机制;可以开发自定义应用程序来处理,但这在金钱和非金钱方面都将过于昂贵,因为目前需求尚未达到高度饱和。
本文重点介绍如何利用现有的服务器端技术来标记财务数据,以便在互联网上传输。建议读者不要将其与新的标记语言的摘要混淆。正如我之前提到的,已经存在允许标记财务信息的机制。另一方面,本文将解释如何利用标记,使用现有基础设施(在我们的例子中是互联网)和高度行业支持的技术(在我们的例子中是 ASP),以经济、高效和可靠的方式传输和处理信息。一种全新的技术与一种旧技术结合使用,这难道不是很讽刺吗?此外,当数据的处理可以毫不费力地在不标记数据的情况下进行时,为什么还要费心处理所有这些标记的废话呢?这样做有非常充分的理由。
- 确实,我们可以利用手头掌握的各种技术来处理数据。然而,这些数据及其存储格式往往是公司独有的。对该公司而言,这当然很好。然而,公司很少孤立存在;事实上,如果它们真的孤立存在,可能也无法长久生存。公司通过与客户和其他组织保持长期联系来生存。就像世界上其他事物一样,联系或关系的存在时间取决于信息在各方之间的有效沟通和传输。当数据以某种方式(在此例中为标记)标准化时,数据传输的可靠性在一定程度上是可以被视为理所当然的。
- 成本是另一个因素,尽管是一个相当重要的因素。当公司拥有公认的数据发送和接收机制时,雇用程序员进行转换、构建应用程序以支持各种交换格式、雇用人员培训员工掌握不同格式的集合、发布广泛的文档以及记录保存等相关成本将大大降低。
- 由于使用 XML 进行信息标记是以文本格式进行的,因此处理成本很低。使用文本文件进行 XML 处理的一个好处是,我们不需要昂贵的专有软件来提取数据,就像处理二进制文件那样。
- 所有 XML 解析器在内部都使用 UNICODE 编码。因此,XML 文档很容易国际化。
- 除了成本,节约时间也是这些好处的结果。因此,公司可以将精力投入到其他项目中。
所以,看吧。我确信还有许多其他优点可以强调标记数据。然而,我认为我已经说明了我的观点。因此,我将直接开始展示如何创建标记语言来处理财务数据。
流程的顶层视图
对于刚刚进入该领域的人来说,我将回顾一些基本概念。用于财务处理的数据将使用自定义标签(标记语言的语法)进行标记。程序员开发的标签是人类可读的。为了使这些标签机器可读,我们需要定义一个词汇表或语法,告诉计算机如何渲染这些标签。本质上,除非赋予了意义,否则标签本身没有意义。此外,由于我们的目标是标准化数据存储和通信,我们还需要确保每个人输入的数据都符合某个标准。标签意义的分配和语法验证将使用文档类型定义 (DTD) 进行——Microsoft Schemas 和 Relax-NG 是另外两个主要竞争者,它们也能完成同样的工作。选择 DTD 而非其他两个的原因是它相对容易使用。然而,其他两种方法比 DTD 提供了更强大的功能,但代价是牺牲了简单性。
一旦文档和标签符合标准,就需要一个名为解析器的程序来解析数据,并将其传递给更高级别的应用程序进行处理。在这个介绍性的例子中,我将使用微软的 MSXML 解析器,该解析器随 IE5.0 一起提供。应用程序将使用一种名为 Active Server Pages (ASP) 的服务器端技术进行设计。我选择 MSXML 和 IE5.0 的原因在于,这会让大多数读者更容易尝试本文中的示例。然而,互联网上有各种各样的解析器,其中一些可以免费使用。下载解析器后,就可以在自定义应用程序中使用它来解析标记语言并生成结果。
用于财务数据交换的 XML 应用程序 表 I:XML 文档<?xml version="1.0" standalone="no" ?>
<!DOCTYPE balancesheet SYSTEM "balsheet.dtd">
<balancesheet>
<contents date="June 30, 2001">
<assets>
<fassets>
<item id="1">
<title>Operating Fixed Assets</title>
<rupee>Rs. 3,305,760</rupee>
</item>
<item id="2">
<title>Capital work-in-progress</title>
<rupee>Rs. 686,035</rupee>
</item>
</fassets>
<cassets>
<item id="3">
<title>Cash and bank balances</title>
<rupee>Rs.963,994</rupee>
</item>
<item id="4">
<title>Trade debts</title>
<rupee>Rs.8,385,843</rupee>
</item>
</cassets>
</assets>
<liabilities>
<cliabilities>
<item id="5">
<title>Short term loans</title>
<rupee>Rs.1,979,219</rupee>
</item>
</cliabilities>
</liabilities>
<equities>
<item id="6">
<title>Share capital</title>
<rupee>Rs.1,429,325</rupee>
</item>
</equities>
</contents>
</balancesheet>
我相信在座的大多数人都能猜到这份文档的内容;它几乎是自解释的,并且展示了公司资产负债表的结构。然而,由于我们要经历整个“磨难”来使数据电子通信更加可靠,我们需要一种机制让计算机也能理解这种标记并判断其有效性。这可以通过 DTD 来实现。下面是一个 DTD 的示例
表 II:XML 文档的 DTD<!ELEMENT balancesheet (contents)>
<!ELEMENT contents (assets,liabilities,equities)>
<!ATTLIST contents date CDATA #REQUIRED>
<!ELEMENT assets (fassets,cassets)>
<!ELEMENT fassets (item+)>
<!ATTLIST item id CDATA #REQUIRED>
<!ELEMENT cassets (item+)>
<!ELEMENT item (title,rupee)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT rupee (#PCDATA)>
<!ELEMENT liabilities (cliabilities,fliabilities?)>
<!ELEMENT cliabilities (item+)>
<!ELEMENT fliabilities (item+)>
<!ELEMENT equities (item+)>
DTD 清楚地标识了每个标签以及它们可以包含的数据值。数据值规范不应与数据类型混淆。由于 DTD 的主要限制(也是一个很好的理由,可以避免使用 DTD 而选择 XML Schemas 或 Relax-NG),DTD 不允许指定数据类型。因此,用户可以很容易地为
此时,我们拥有了一个基本的系统,可以
- 按需共享数据
- 根据组织要求处理数据
- 根据组织要求显示数据
我们有效地完成了可用于交换财务信息的文档结构。提出的语言结构可以符合 GAAP 和证券交易委员会的要求。合规性可以通过 DTD 来强制执行。由于篇幅限制以及基于信息项目不断演变,我没有包含标记数据和 DTD 的完整代码。
文档验证后该怎么办?
好的,数据已经标记并验证。接下来呢?我们如何实际处理这些数据?处理 XML 数据需要一个名为解析器的软件程序。解析器能够读取 XML 语法并获取信息。然后,这些解析器被用于应用程序中;应用程序本质上是提供用户界面的集成方式。
那么,数据访问是如何实现的呢?这需要为我们的模型添加一个额外的层。请注意名为 DOM 的额外层。DOM 代表文档对象模型。DOM 是一个应用程序编程接口 (API),它允许程序员访问标记数据并处理这些数据。
在我们的应用程序中使用 DOM 访问数据
在我深入探讨此主题之前,有必要讨论一下 DOM 的版本和支持。由于 XML 相关技术是新生事物,大多数仍处于构建和测试阶段。然而,在 XML 成为 W3C 推荐标准之前,DOM 就已经在使用中了。事实上,正是 DOM 和 HTML 的结合才使得动态 HTML (DHTML) 成为可能。尽管如此,DOM 一直在不断变化,以适应最新的 XML 系列技术(XML 系列技术是指各种协同工作的语言,用于增强 XML 的功能,包括:XPath、XSL、Xlink、Xpointer、Xquery 等)。
本文讨论的 DOM 规范是 Level 1。使用 IE 5.0 的用户可以安全地假设,他们的系统已经安装了该级别的 DOM。
为了我们的目的,将使用 ASP 设计一个基本的 Web 应用程序。ASP 将负责与 DOM 函数通信以处理标记的数据。
给我看“如何”操作
下面展示了一个 ASP 代码,用于访问 ID 属性分别为 1 和 2 的两个资产负债表值。然后将总计输出到浏览器。我不会深入讲解这段代码的工作原理,因为它涉及到对 Active Server Pages 的全面讨论。这个例子应该足以说明,我们可以多么轻松地使用 DOM API 来访问数据并对其进行操作以满足组织的需求。
表 III:ASP 应用程序示例代码
<%
set objxml=server.createobject("microsoft.XMLDOM")
objxml.load(server.mappath("balsheet.xml"))
set objbalsheet=objxml.documentElement
set objfig1=objbalsheet.selectsinglenode("//item[@id='1']/rupee")
set objfig2=objbalsheet.selectsinglenode("//item[@id='2']/rupee")
fig1=objfig1.text
fig2=objfig2.text
fig1=Mid(fig1,4,10)
fig2=Mid(fig2,4,10)
fig1=clng(fig1)
fig2=clng(fig2)
total=fig1+fig2
response.write total
%>
可以肯定地说,这个应用程序所能掌握的多功能性和强大功能仅受开发团队创造力的限制。
我们取得了什么成就?
咳咳!这是我们都问过或听过的问题;然而,每次被问到时,它总会让我们感到困扰。我认为我欠那些耐心地读完整篇文章的观众一个答案。
说实话,我们什么都没实现。等一下。别激动,继续往下读。我说这话的原因很快就会显现。我们之所以说“什么都没实现”,是因为我们所做的任何事情都不是全新的,而是已经发生过的。事实上,数学处理和计算是系统处理器最核心的部分。
然而,我们所实现的是一种新的交流信息和电子交换信息的方式。我们发现了数据的结构如何可以变得既明显(对应用程序和人类而言)又透明,从而使不兼容的系统可以交换文档,同时避免出现各种错误。到目前为止,当所有使用的标记语言都采用美国标准时,我们有效地找到了一种机制,可以使用非北美地区为企业设计的标准来记录数据。国际化是所有这些努力的核心。尽管我们所做的事情并非全新,但我们所取得的成就值得研究。事实上,如果 XML 系列技术的潜力得到实现并加以利用,那将无异于一场革命。
我还可以用标记数据做什么?
为什么不呢!事实上,这就是这个标记交易的重点。一旦我们的文档遵循我们的标准并具有严格的层次结构,我们就可以对数据做几乎任何事情。它可以按原样存储在数据库中,因为供应商已经开始支持 XML 作为原生格式。它可以导入到 Microsoft Word 或 Excel 中。它甚至可以转换为 Adobe 的 PDF 格式等格式。数据可以使用 Web 浏览器进行渲染。基本上,任何应用程序都可以利用我们的数据。
最后的想法
正如生活中的其他事物一样,设计数据交换机制的方法不止一种。我上面提出的 DTD 很快就会被 XML Schemas 取代。XML Schemas 比 DTD 更强大,并且可以支持数据类型。XML Schemas 也更灵活,更容易上手。Schema 相对于 DTD 的另一个优点是,前者是用纯 XML 编写的,而后者是用一种称为扩展巴克斯范式 (Extended Backus Naur Form, EBNF) 的语言表示的。也无法使用 DOM 访问 DTD。DTD 的一个主要限制是,一个 XML 文档只能关联一个 DTD。因此,不可能将一套相当复杂的 DTD 分解成更小的 DTD 以便简化和清晰。
然而,XML Schemas 拥有 DTD 所缺乏的功能。不幸的是,由于这项技术仍处于起步阶段,XML Schemas 并非万无一失——至少目前是这样。因此,如果采用 schemas 作为验证 XML 文档的首选机制,则必须谨慎。事实上,我无法使用 MSXML 解析器针对 XML schema 验证我的文档。然而,随着这个标记交易的不断成熟,我们可以合理地期望 XML Schemas 会取代 DTD。
我还提到了 DOM 如何用于操作标记数据。对于 XML 程序员来说,另一个有用的 API 是 Simple API for XML (SAX)。DOM 将 XML 文档视为内存中的树形结构,而 SAX 是一套事件驱动的 Java 接口,它将 XML 文档作为流进行处理。
SAX 是开源的,并且可以免费下载。SAX,与 DOM 类似,用于分析 XML 文档并从中提取信息。然而,对于较大的文档,SAX 可能比 DOM 产生更好的结果(部分原因是 DOM 在内存中建模整个文档,需要更多的系统资源)。大多数人可能甚至不会遇到 SAX,因为它通常与 Java 语言结合使用。要了解更多关于 SAX 的信息,请访问其网站:http://www.megginson.com/SAX/
在我结束之前,还有一个概念必须讨论。由于 XML 是一种允许定义自定义标签的技术,因此很可能会出现两个人使用相同的标签来表示不同的实体。如果汽车行业决定使用“
定义新的标记语言,如果没有为我们的标签分配命名空间,那是不完整的。我之所以避免使用命名空间,是因为本文的目的是对整个标记过程进行宏观概述。我将在另一篇文章中详细介绍。