65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C#, LINQ, XML 和菜单及工具栏实现的 Outlook 类型通讯录

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (8投票s)

2009 年 8 月 28 日

CPOL

4分钟阅读

viewsIcon

42121

downloadIcon

1636

使用 C#, LINQ, XML 和菜单及工具栏实现的 Outlook 类型通讯录

引言

这是一个使用 LINQ 和 XML 创建 Outlook 类型通讯录的示例项目。它还展示了如何在 Windows 应用程序中使用菜单和工具栏。

背景

LINQ(语言集成查询)是 Microsoft .NET Framework 的一个组件,它为 .NET 语言添加了原生的数据查询功能。它允许您查询类似于 arraylist、List 等集合。LINQ to XML 是一种在 .NET 语言中构建、编写和读取 XML 数据的新方法。 这种新的 API 简化了 XML 数据的操作,而无需求助于额外的语言语法,如 XPath 或 XSLT。 LINQ to XML 并非任何当前 DOM 或 XML 类库的替代品; 在许多情况下,LINQ to XML 与它们的功能重叠,旨在提供更好的开发人员体验,但现有代码将继续工作。 LINQ to XML 的一个方面是它支持编写查询表达式,并且可以与其他任何 LINQ 技术结合使用,以创建或使用 XML 数据作为源或目标格式。

Using the Code

通讯录使用 C# 创建,并使用 XML 作为数据库来存储联系人。对该 XML 文件中记录的添加、删除和更新均使用 LINQ 完成。

在您浏览示例项目的过程中,大多数代码都很容易理解。我将解释如何使用 LINQ 来处理我的 XML 文件。

确保您引用了System.LINQSystem.XML.LINQ,以便使用 LINQ to XML。

如果您浏览staticXMLParse,您将看到所有与 LINQ 相关的代码都在这里完成。让我解释一下它是如何工作的。

创建一个新的XDocument类对象,如下所示

XDocument xmlDoc = XDocument.Load(XMLFilePath);

这将表示您整个 XML 在内存中。现在,我们可以查询此xmlDoc来检索记录,如下所示

var addresses = from Address in xmlDoc.Descendants("Address")
select new {
    FirstName = Address.Element("FirstName").Value,
        LastName = Address.Element("LastName").Value,
        Email = Address.Element("Email").Value,
        Address1 = Address.Element("Address1").Value,
        Address2 = Address.Element("Address2").Value,
        City = Address.Element("City").Value,
        Country = Address.Element("Country").Value,
        Zip = Address.Element("Zip").Value,
        Phone1 = Address.Element("Phone1").Value,
        Phone2 = Address.Element("Phone2").Value,
        State = Address.Element("State").Value,
};

从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式类型var。 隐式类型的局部变量是强类型的,就像您自己声明了类型一样,但是编译器会确定类型。 在这里,我们的var地址将具有以下属性,例如FirstNameLastName....State。 它们的值来自 XML 的元素。 这里需要注意的是,这些var地址将像一个集合一样,该集合将包含对象集合,并且每个对象将具有这些属性。 因此,如果您想使用contacts类的对象填充您的List,您可以这样做

foreach (var address in addresses)
{
    Contacts contact = new Contacts();
    contact.FName = address.FirstName;
    contact.LName = address.LastName;
    contact.Email = address.Email;
    contact.Address1 = address.Address1;
    contact.Address2 = address.Address2;
    contact.City = address.City;
    contact.State = address.State;
    contact.Country = address.Country;
    contact.Phone1 = address.Phone1;
    contact.Phone2 = address.Phone2;

    ContactList.Add(contact);
}

添加联系人

查看XMLParse类的AddContact函数。 要添加新的联系人,请创建一个新的XElement并将其添加到您的XDocumentRoot节点,即xmlDoc。 第一个参数是主节点,从第二个参数开始,它将是XElement,这些元素将进入主节点内部。

xmlDoc.Root.Add(
                new XElement("Address",
                new XElement("FirstName", contact.FName),
                new XElement("LastName", contact.LName),
                new XElement("Email", contact.Email),
                new XElement("Address1", contact.Address1),
                new XElement("Address2", contact.Address2),
                new XElement("City", contact.City),
                new XElement("Country", contact.Country),
                new XElement("Zip", contact.Zip),
                new XElement("Phone1", contact.Phone1),
                new XElement("Phone2", contact.Phone2),
                new XElement("State", contact.State)
                ));

一旦您添加了新的XElement,它就会被添加到内存中的 XML 文档中。 我们需要更新磁盘上的主 XML 文件。 所以

 xmlDoc.Save(XMLFilePath);

更新联系人

我设计时将电子邮件地址作为主键。 因此,要更新,我们将匹配电子邮件地址,然后更新相应的XElement。 假设,我有一个需要更新的电子邮件地址。 接着从您的内存中获取XElement

XElement element = xmlDoc.Root.Elements("Address").Where(r => (
    string)r.Element("Email") == contact.Email).FirstOrDefault();  

这将返回电子邮件地址匹配的元素。FirstOrDefault()将返回第一次出现匹配或默认值。

使用XElement类的SetElementValue函数来更新该值,如下所示

if (element != null)
{                                  
    element.SetElementValue("FirstName", contact.FName);
    element.SetElementValue("LastName", contact.LName);
    element.SetElementValue("Email", contact.Email);
    element.SetElementValue("Address1", contact.Address1);
    element.SetElementValue("Address2", contact.Address2);
    element.SetElementValue("City", contact.City);
    element.SetElementValue("Country", contact.Country);
    element.SetElementValue("Zip", contact.Zip);
    element.SetElementValue("Phone1", contact.Phone1);
    element.SetElementValue("Phone2", contact.Phone2);
    element.SetElementValue("State", contact.State);
    xmlDoc.Save(XMLFilePath);
}

删除联系人

删除将以与更新相同的方式工作。 但在这种情况下,我们将查询xmlDoc以获取元素,然后使用remove函数删除该元素。

XElement element = xmlDoc.Root.Elements("Address").Where(r => (string)r.Element(
    "Email") == emailAddress).FirstOrDefault();        
if(element!=null)           
element.Remove();

关注点

LINQ 是一种处理 XML 和 SQL 的非常酷的方式。 它使开发人员的生活变得非常轻松。 此外,此通讯录示例是一个完全独立的示例。 您可以创建此项目的 DLL,并将其与您现有的任何应用程序一起使用。

历史

  • 2009 年 8 月 28 日:初始发布
© . All rights reserved.