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 对象。)
@H_301_80@这里的缺陷非常明显。XmlDocument 使用的 IEnumerable 实现没考虑齐全,它只遍历上层的 XmlNode 对象,这样你只能见到最上层的节点。也就是说,如果你不定制 XML 数据绑定的过程,就只能绑定到最顶层的节点,并且只能显示那个节点的特性。如果顶层节点有多种类型,绑定控件将使用第一个节点的架构。
那么,如何显示 XML 文档中更深层次的内容?你有以下几个选择:
- 可以用 XPath 过滤出重要的元素
- 可以用 XSL 把 XML 转换为你希望的扁平化结构
- 可以把一个数据控件嵌套到另一个数据控件中
- 可以使用支持层次数据的控件(.NET 唯一满足这一需求的现成控件是 TreeView)
01. 使用 XPath
绑定到 XmlNode 时,通常只会显示特性值。不过,你可以使用 XPath 数据绑定表达式获得嵌套元素的文本。实现这一目的最灵活的办法是使用一个定义了 XPath 数据绑定表达式的模版。
@H_301_80@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>