XML(数据绑定)
和 sqlDataSource 以及 ObjectDataSource 相似,XmlDataSource 控件以声明性的方式工作,不过也有两个主要的不同点:
- XmlDataSource 不是从数据库或数据访问类而是从 XML 文件获取信息,它为其他控件的数据绑定提供一个 XmlDocument 对象。
- XML 内容是分层的且可有无限多层。而 sqlDataSource 和 ObjectDataSource 返回的是平面数据表。
非层次化绑定
处理 XML 数据固有的层次化的最简单的办法就是忽略它,直接把 XML 数据源绑定到普通的网格控件上:
<asp:GridView ID="GridView1" runat="server" DataSourceID="sourceDVD">
</asp:GridViewasp:XmlDataSource ="sourceDVD" DataFile="DvdList.xml"></asp:XmlDataSource>
XmaDataSource 从 DvdList.xml 文件抓取数据并作为 XmlDocument 对象提供给 GridView,然后调用 DataBind()。因为 XmlDocument 实现了 IEnumable 接口,因此 GridView 可以像遍历 DataView 相似的方式来遍历它的结构。GridView 遍历了 XmlDocument.Nodes 集合并获取了每个 XmlNode 的所有特性。
(调用 XmlDataSource.GetXmlDocument()可让它把内容返回为 XmlDocument 对象。)
这里的缺陷非常明显。XmlDocument 使用的 IEnumerable 实现没考虑齐全,它只遍历上层的 XmlNode 对象,这样你只能见到最上层的节点。也就是说,如果你不定制 XML 数据绑定的过程,就只能绑定到最顶层的节点,并且只能显示那个节点的特性。如果顶层节点有多种类型,绑定控件将使用第一个节点的架构。
那么,如何显示 XML 文档中更深层次的内容?你有以下几个选择:
- 可以用 XPath 过滤出重要的元素
- 可以用 XSL 把 XML 转换为你希望的扁平化结构
- 可以把一个数据控件嵌套到另一个数据控件中
- 可以使用支持层次数据的控件(.NET 唯一满足这一需求的现成控件是 TreeView)
01. 使用 XPath
绑定到 XmlNode 时,通常只会显示特性值。不过,你可以使用 XPath 数据绑定表达式获得嵌套元素的文本。实现这一目的最灵活的办法是使用一个定义了 XPath 数据绑定表达式的模版。
XPath 数据绑定表达式和 Eval()表达式基本类似,不过要基于当前节点提供 XPath 而不是再提供要显示的字段名字。
<Columns>
<asp:TemplateField HeaderText="DVD">
<ItemTemplate>
<b><%# XPath("Title") %></b><br />
<%# XPath("Director") %><br />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
遗憾的是,需要借助模版才能获得编写 XPath()表达式的能力。这限制了 XML 数据绑定场景中其他控件(如下拉列表框)的使用。
还可以使用 XPath 过滤出初始的匹配集,例如,要显示所有的演员名单:
XPath="/DvdList/DVD/Starring/Star">
1: #XPath(".")%>
asp:TemplateField>