从集合列表中创建XML文件

时间:2016-12-05 12:09:36

标签: c# xml linq

我有一个收集字符串,其中包含有关客户的信息,例如姓名,性别等。所有客户都有一个ID。

现在我想创建一个包含所有客户的通用XML文件。类似下面的例子:

<custumers>
  <custumer>
      <name></name>
       <id></id>
       <etc></etc>
  </custumer>
</custumers>

没有XML文件的启动很简单,我使用linq创建了xml文件。

对于初始创建,我使用了以下代码:

try
{
    var xEle = new XElement("Customers",
    from cus in cusList
        select new XElement("Customer",
           new XElement("Name", cus.Name),
           new XElement("gender", cus.gender),
           new XElement("etc", cus.etc));
}
xEle.Save(path);

但是,如果我想更新XML文件,我会遇到一些问题。 我的解决方法是:

Iterate over all customers in list and check for all customers if the customer.id exists in the XML.
IF not: add new customer to xml  
IF yes: update values

到目前为止我的代码:

var xEle = XDocument.Load(xmlfile);
foreach (cus in cusList)
try
{
    var cids = from cid in xEle.Descendants("ID")
               where Int32.Parse(xid.Element("ID").Value) == cus.ID          
               select new XElement("customer", cus.name),
                  new XElement ("gender"), cus.gender),
                  new XELement ("etc."), cus.etc) 

        );
       xEle.Save(xmlpath);
}

2 个答案:

答案 0 :(得分:0)

另一种方法怎么样......

using System.IO;
using System.Text;
using System.Xml.Serialization;

public void Main()
{
    DataSet Custumers = new DataSet("Custumers");
    DataTable Custumer = new DataTable("Custumer");

    // Create the columns
    Custumer.Columns.Add("id", typeof(int)).Unique = true;
    Custumer.Columns.Add("name", typeof(string));
    Custumer.Columns.Add("gender", typeof(string));
    Custumer.Columns.Add("etc", typeof(string));

    // Set the primary key
    Custumer.PrimaryKey = { Custumer.Columns("id") };

    // Add table to dataset
    Custumers.Tables.Add(Custumer);
    Custumers.AcceptChanges();

    // Add a couple of rows
    Custumer.Rows.Add(1, "John", "male", "whatever");
    Custumer.Rows.Add(2, "Jane", "female", "whatever");
    Custumer.AcceptChanges();

    // Let's save this to compare to the updated version
    Custumers.WriteXml("Custumers_Original.xml");

    // Read in XML that contains an existing Custumer and adds a new one
    //  into a Clone of the Custumer table
    DataTable CustumerUpdate = Custumer.Clone;
    CustumerUpdate.ReadXml("Custumers_Update.xml");

    // Merge the clone table data to the Custumer table
    Custumer.Merge(CustumerUpdate);
    Custumer.AcceptChanges();

    Custumers.WriteXml("Custumers_Final.xml");
}

Custumers_Original.xml如下所示:

<?xml version="1.0" standalone="yes"?>
<Custumers>
    <Custumer>
        <id>1</id>
        <name>John</name>
        <gender>male</gender>
        <etc>whatever</etc>
    </Custumer>
    <Custumer>
        <id>2</id>
        <name>Jane</name>
        <gender>female</gender>
        <etc>whatever</etc>
    </Custumer>
</Custumers>

Custumers_Update.xml具有此功能,对John进行了更改并添加了George

<?xml version="1.0" encoding="utf-8" ?>
<Custumers>
    <Custumer>
        <name>John</name>
        <id>1</id>
        <gender>male</gender>
        <etc>this is new</etc>
    </Custumer>
    <Custumer>
        <name>George</name>
        <id>3</id>
        <gender>male</gender>
        <etc>grandson</etc>
    </Custumer>
</Custumers>

合并后,Custumers_Final.xml包含:

<?xml version="1.0" standalone="yes"?>
<Custumers>
    <Custumer>
        <id>1</id>
        <name>John</name>
        <gender>male</gender>
        <etc>this is new</etc>
    </Custumer>
    <Custumer>
        <id>2</id>
        <name>Jane</name>
        <gender>female</gender>
        <etc>whatever</etc>
    </Custumer>
    <Custumer>
        <id>3</id>
        <name>George</name>
        <gender>male</gender>
        <etc>grandson</etc>
    </Custumer>
</Custumers>

答案 1 :(得分:0)

我的解决方案是linq:

 try
   {
      XDocument xEle = XDocument.Load(path);
      var ids = from id in xEle.Descendants("Custom")
      where id.Element("id").Value == cus.ID
         select id;

      foreach (XElement idCustom in ids) 
      {
         idCustom.SetElementValue("NewName", "NewElement");
      }
      xEle.Save(path);
      }