如何使用此结构中的linq-to-xml检索子节点并将其添加到选定的类别?

时间:2013-08-14 17:40:12

标签: c# xml linq

我想根据用户选择的类别将“联系人”添加到“联系人”。假设用户从组合框中选择“朋友”,我将如何添加到所选类别。

<PhoneContacts>
  <Categories>
    <Category Name="Colleagues">
      <Contacts />
    </Category>
    <Category Name="Friends">
      <Contacts />
    </Category>
  </Categories>
</PhoneContacts>


Fields to be added is this
<Contact>
  <fullname>joe</fullname>
  <phoneno>123456</phoneno>
  <address>stack overflow</address>
</Contact>

1 个答案:

答案 0 :(得分:0)

使用LINQ to XML可以轻松完成。您需要创建一个包含联系人信息的新XElement,然后将其添加为正确类别中Contacts元素的子项。为简单起见,我建议使用方法创建联系人XElement,然后将其添加到XML中。它看起来像这样:

public XElement CreateContact(string name, string phone, string address)
{

    XElement contact = new XElement("Contact", 
                           new XElement("fullname", name),
                           new XElement("phoneno", phone),
                           new XElement("address", address));

    return contact;
}

然后你可以添加如下内容:

XDocument xDoc = XDocument.Load("contacts.xml");

string category = "Friends";
string name = "joe";
string phone = "123456";
string address = "stack overflow";

xDoc.Descendants("Contacts")
    .Where(x => x.Parent.Attribute("Name").Value == category)
    .Single()
    .Add(CreateContact(name, phone, address));

xDoc.Save();

上面的代码通过加载XML文件来创建XDocument(xDoc)。

LINQ语句根据与类别变量匹配的父节点Contact属性选择正确的Name节点(另请注意,它希望只有一个匹配项)。然后,它通过Contact返回的XElement添加新的CreateContact节点组。

然后保存更新的XML文件。

新XML将如下所示:

<PhoneContacts>
  <Categories>
    <Category Name="Colleagues">
      <Contacts />
    </Category>
    <Category Name="Friends">
      <Contact>
        <fullname>joe</fullname>
        <phoneno>123456</phoneno>
        <address>stack overflow</address>
      </Contact>
    </Category>
  </Categories>
</PhoneContacts>