WPF - 使用 Linq to XML 处理 XML 文件






3.89/5 (10投票s)
构建 WPF ListView 应用程序以使用 Linq to XML 读取 XML 文件。
引言
我一直在使用 Lawson M3 ERP 软件(以前称为 Intentia Movex),并且喜欢探索开发者可用的新技术。
M3 软件拥有最佳的数据库模型设计之一,并且托管在 IBM System AS/400(iSeries 或 System i)的稳定平台上。我正在使用 Microsoft.Net 2.0 或更高版本来开发与 Lawson M3 数据库和 API 的自定义集成解决方案,以满足业务需求。
最近,我参加了在罗利(2008 年 11 月 15 日)举行的代码营,并对 Karl Shifflett(http://karlshifflett.wordpress.com/)的开幕演讲印象深刻。这启发了我开始写作,并与开发人员社区分享我的知识和经验。Karl 使用 Microsoft Visual Studio 2008 和 .NET 3.5 进行了两次关于 WPF 的演讲。我决定探索和学习 WPF(Windows Presentation Foundation),并将其应用于 Lawson M3 以满足业务需求。
背景
在本文中,我们将学习如何使用 M3 数据库表 OCUSMA(版本 12.4)在 WPF 中构建用户界面 (UI);这是一个包含 226 个字段的客户主数据表。数据层与 UI 层是分开开发的,可以根据可用选项替换为适合需求的层。
数据源可以替换为以下不同选项:
- ADO.NET(通过 OLE DB、ODBC 连接到 AS/400)
- M3 提供的 M3 API
- Web 服务
- XML 文件
在此演示中,我将使用一个演示 XML 文件 *ocusma.xml* 作为数据源。M3 在其软件中提供了标准的 UI 界面,但许多业务用户需要自定义 UI,允许他们选择适合其业务需求的字段。
下图所示的 XML 文件有一个顶层元素“row
”代表记录,子元素表示字段和数据值。在 WPF 中,我们将使用三个字段来演示列表视图。
OKCUNO
- 客户编号OKCUNM
- 客户名称OKPHNO
- 电话
Using the Code
要求
- Microsoft Windows XP、Vista 或 Windows 2008
- Microsoft Visual Studio 2008 SP1
- XML 文件 *ocusma.xml*
我正在使用 Windows 2008 和 VS2008 SP1。
步骤 1
启动 VS 2008,并在项目类型 Visual C# 下创建一个新的 WPF 项目。
将项目命名为 Wpf_Customer
。
单击 OK 按钮继续。
Visual Studio 将创建一个 WPF 应用程序项目框架,我们可以用它来创建我们的应用程序。

第二步
在解决方案资源管理器中,右键单击 *Window1.xaml* 文件,然后从上下文菜单中选择“删除”以删除该文件。我们将添加一个新的 Window (WPF) 文件并将其设置为启动窗口。
右键单击并选择“添加”->“新建项…”
在“类别”中选择 WPF,在“模板”中选择“窗口(WPF)”。
将“名称”字段的值更改为:*CustomerList.xaml*,然后单击“添加”按钮。

步骤 3
从解决方案资源管理器中打开 *App.xaml* 文件。
将 StartupUri
的值从“*Window1.xaml*”替换为“*CustomerList.xaml*”,将 *CustomerList.xaml* 设置为启动窗口。
步骤 4
按 Ctrl + F5 运行应用程序以检查是否有任何错误。您应该会看到一个空白窗口,没有数据。
单击窗口右上角的 X 图标关闭应用程序。
步骤 5
通过右键单击项目并选择“新建文件夹”来为项目添加一个名为 *DAL* 的新文件夹。
我们将把所有数据访问层代码放在 *DAL* 文件夹中,以读取 *ocusma.xml* 文件中的信息。
通过右键单击项目并选择“现有项…”将 *ocusma.xml* 添加到项目中(该文件包含在下载的 zip 文件中)。

右键单击 *ocusma.xml* 文件,然后从上下文菜单中选择“属性”。
将“生成操作”的值更改为“内容”。
将“复制到输出目录”的值更改为“始终复制”。
这将确保文件被复制到输出目录,并可供 WPF 程序访问。
步骤 6
创建名为 Customer
的类,用于数据访问层和 WPF UI 层存储客户信息。
通过右键单击项目中的 *DAL* 文件夹并选择“新建项…”来添加一个新的类文件。
在“类别”中选择“代码”,在“模板”中选择“类”。
将 `Name` 字段的值更改为 *cCustomer.cs*,然后单击“添加”。这将在 *DAL* 文件夹中添加一个 *cCustomer.cs* 文件。
将以下代码添加到类文件中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace Wpf_Customer.DAL
{
class cCustomer
{
public string OKCUNO { get; set; }
public string OKCUNM { get; set; }
public string OKPHNO { get; set; }
}
// The DAL will read the information from the XML file and load into a List
class DAL_OCUSMA
{
public static List<cCustomer> LoadOCUSMA()
{
List<cCustomer> ListCustomerRecords = new List<cCustomer>();
// Execute the query using the LINQ to XML
var custs = from c in XElement.Load(@"OCUSMA.xml").Elements("row") select c ;
foreach (var customer in custs)
{
cCustomer lCustomer = new cCustomer
{
OKCUNO = customer.Element("OKCUNO").Value,
OKCUNM = customer.Element("OKCUNM").Value,
OKPHNO = customer.Element("OKPHNO").Value
};
ListCustomerRecords.Add(lCustomer);
}
return ListCustomerRecords;
}
}
}
类“cCustomer
”中的属性 OKCUNO
、OKCUNM
、OKPHNO
映射到 OCUSMA
表中的字段。
类 DAL_OCUSMA
提供一个 static
方法“LoadOCUSMA
”,该方法将返回所有客户记录的列表。代码使用 LINQ to XML 读取 *ocusma.xml* 文件并将记录添加到 List 中。
步骤 7
现在是设计 UI 的时候了。通过双击 *CustomerList.xaml* 文件,从解决方案资源管理器中打开它。
将主窗口的宽度从 300 更改为 500。
删除包含 <Grid> </Grid>
的行。这将从 Window 容器中删除 Grid 面板。
添加 <StackPanel> </StackPanel>
行。这将向 Window 容器添加一个堆栈面板。我们现在添加的任何控件或组件都将垂直堆叠。
在 stackpanel
之间添加一个按钮控件,代码如下:
<Button Height="25” Width="50” Click="Button_Click">Load</Button>
添加以下代码以添加一个 listview
控件。
<ListView Name="listView1" HorizontalAlignment="Left"
VerticalAlignment="Top" ItemsSource="{Binding}">
<ListView.View>
<GridView >
<GridView.Columns>
<GridViewColumn Width="75" Header="Customer"
DisplayMemberBinding="{Binding Path=OKCUNO}" />
<GridViewColumn Width="250" Header="Name"
DisplayMemberBinding="{Binding Path=OKCUNM}" />
<GridViewColumn Width="125" Header="Telephone"
DisplayMemberBinding="{Binding Path=OKPHNO}" />
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
ListView
的视图将包含三个 GridView
列。每个 GridView
列都通过数据绑定映射到类 cCustomer
的属性 OKCUNO
、OKCUNM
、OKPHNO
中指定的字段名。
CustomerList.xaml 应如下所示:

按 Ctrl+F5 运行应用程序。这将显示按钮和 ListView
,但没有数据。
单击窗口右上角的 X 图标关闭应用程序。
步骤 8
通过双击文件,从解决方案资源管理器中打开代码隐藏文件“*CustomerList.xaml.cs*”。
添加一行...
using Wpf_Customer.DAL
...到 `namespace` 行之前。
在 Button_Click
方法中添加以下行:
“private void Button_Click(object sender, RoutedEventArgs e)”
List<cCustomer> customerList = new List<cCustomer>();
customerList = DAL_OCUSMA.LoadOCUSMA();
listView1.DataContext = customerList;
我们将创建一个名为 customerList
的 List
,并通过调用 DAL_OCUSMA
的 static
方法 LoadOCUSMA
来添加 customer
记录。该 list
将被绑定到 ListView
控件 listView1
。
按 Ctrl + F5 运行应用程序。
单击加载按钮。列表将使用 *ocusma.xml* 中的记录进行填充。
摘要
我们已经看到了如何创建一个 WPF 应用程序,该应用程序将读取 XML 文件并将记录加载到 ListView
控件中。
参考文献
- 我的博客:http://shivakamathblog.blogspot.com/
- WPF:http://msdn.microsoft.com/en-us/library/ms752299.aspx
- Linq to XML:http://msdn.microsoft.com/en-us/library/bb308960.aspx
- Lawson M3:http://www.lawson.com/
- Karl Shifflett 博客:(http://karlshifflett.wordpress.com/)
历史
- 2008 年 11 月 30 日:首次发布