【问题标题】:Create XML file from collection list从集合列表创建 XML 文件
【发布时间】:2017-04-19 19:55:31
【问题描述】:

我有一个集合字符串,其中包含姓名、性别等客户信息。所有客户都有一个 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);
}

【问题讨论】:

  • 您想更新 XML?为什么不能直接重写?
  • 如果我想重写它,我需要从现有的 XML 中加载所有数据。我不认为这是一个高效的解决方案。还是我错了?
  • 检查每个 ID 会花费更多的 CPU 时间。不会吗?
  • 听起来您想在 XML 文件的中间添加或修改一个节点。 XML 文件只是一个文本流而不是数据库;没有简单的方法可以在文本流中间插入。见Adding a Line to the Middle of a File with .NET。但要附加请参阅Fastest way to add new node to end of an xml?Appending an existing XML file with XmlWriter。最简单的解决方案是将 XML 加载到内存中,编辑节点,然后写入整个文件。
  • @dbc 谢谢,我会尝试一些不同的解决方案。

标签: c# xml linq


【解决方案1】:

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

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>

【讨论】:

  • 不错的方法,谢谢!我也使用linq解决了它。我会检查哪个性能更好,更安全。
  • 您从未告诉我们的一件事是新客户数据的来源......这会有所作为。
【解决方案2】:

也是我使用 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);
      }

【讨论】:

  • 这可能会满足您的更新要求,但不会添加新记录...只是说说而已。
猜你喜欢
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多