如何将XPathNavigator.Select()绑定到控件的DataSource?

时间:2013-10-25 04:51:52

标签: asp.net xml vb.net optimization xpath

我正在使用面向非常高的使用负载的.NET应用程序,所以我正在筛选数据方法,因为性能一直是个问题。由于查询的重复性和只读性,它严重依赖于XML。

同一个文件的大量读取在一次访问中发生,一些用于单个变量读取,一些用于绑定到数据源(后者是更大的挑战)。我想加载一次然后将对象传递给使用它的其他页面和函数。这是我一直在做DataSource绑定的方法:

在父文件中:

Public Property XmlDoc As XmlDocument("file.xml")

在子文件中:

Dim nodes As XmlNodeList = XmlDoc.SelectNodes("/path")

If nodes.Count > 0 Then
  myListView.DataSource = nodes
  myListView.DataBind()
Else
  myListView.Visible = False
End If

这段代码很容易做到,但我刚刚读过on MSDN XmlDocument的性能非常差。他们建议使用XPathNavigator,它很容易变量,但我不知道如何将它设置为控件的数据源。这是我的尝试:

Dim xDoc As XPathDocument = New XPathDocument("file.xml")
Dim xNav As XPathNavigator = xDoc.CreateNavigator()

myListView.DataSource = xNav.MysteryFunction("/path")
myListView.DataBind()

不幸的是,MysteryFunction()不存在。

任何人都可以帮助解决这些代码,或者提供高性能的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我刚刚找到了一个解决方案,所以我想我会把它作为一个可能的答案。

如果您专注于设置控件的DataSource,那么您应该使用XmlDataSource。但是XmlDataSource并不好,所以你应该运行XPathNavigator的第二个变量。这是你如何做到的。

在父文件中:

Public Property Xds As XmlDataSource
Public Property XNav As XPathNavigator

...

Xds.DataFile = "file.xml"

XNav = Xds.GetXmlDocument().CreateNavigator

在子文件中:

Master.Xds.XPath = "/path/data"
myListView.DataSource = xds.Data

Dim attribute As String = Master.XNav.SelectSingleNode("/path/var").GetAttribute("name", "")

<强>更新

我做了一些性能测试,从XmlDocument做只读数据绑定比使用XmlDataSource慢大约1000倍。通过在父文件中实例化对象并在子文件中引用它,可以获得更小但仍然明显的性能提升。

由于这看起来很好,我会接受这个作为答案。