从List <t> </t>更新XML文件

时间:2011-12-02 00:30:01

标签: c# xml linq-to-xml

我有一个包含 -

等记录的XML文件
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfCLocation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <CLocation>
    <CId>5726</CId>
    <Long>0</Long>
    <Lat>0</Lat>
    <Status>Pending</Status>
  </CLocation>
  <CLocation>
    <CId>5736</CId>
    <Long>0</Long>
    <Lat>0</Lat>
    <Status>Processed</Status>        
  </CLocation>
</ArrayOfCLocation>

我把这些记录作为 -

列入名单
XDocument xDocument = XDocument.Load(filePath); 
List<T> list = xDocument.Descendants("CLocation")
     .Select(c => (new T()
     {
         CId = Convert.ToInt32(c.Descendants("CId").FirstOrDefault().Value),
         Lat = Convert.ToDouble(c.Descendants("Lat").FirstOrDefault().Value),
         Long = Convert.ToDouble(c.Descendants("Long").FirstOrDefault().Value),
         Status = (Status)Enum.Parse(typeof(Status), c.Descendants("Status").FirstOrDefault().Value)
     }))
     .Where(c => c.Status == Status.Pending)
     .Take(listCount)
     .ToList();

现在,我在上面的集合中更新T对象(设置其Lat / Log字段) 在处理完这些对象后,我想将这些记录更新回XML文件。

任何人都可以请我指导一个有效的解决方案,我该如何将这些对象更新回XML文件。

1 个答案:

答案 0 :(得分:4)

你可以这样做:

foreach (var location in list)
{
    var elem = xDocument.Root.Elements()
                        .Single(e => (int)e.Element("CId") == location.CId);
    elem.Element("Long").ReplaceNodes(location.Long);
    elem.Element("Lat").ReplaceNodes(location.Lat);
}

然后,您可以将修改后的xDocument保存回文件或其他任何内容。

如果您发现这样做效率不高,有几种方法可以加快速度。例如,按Dictionary创建CId个元素,这样每次都不会搜索整个文档。

但是如果你有大文件,将它们整个加载到内存中可能是不可能的或者是个好主意。使用XmlReaderXmlWriter适用于任何规模的文件,但它们并不易于使用。

另一个需要考虑的选择是XML序列化。它专门用于将XML转换为您的对象并返回。

此外,您所拥有的代码可以简化很多,并且在此过程中更快:

xDocument.Root.Elements("CLocation")
     .Select(c => new Location
                  {
                      CId = (int)c.Element("CId"),
                      Lat = (double)c.Element("Lat"),
                      Long = (double)c.Element("Long"),
                      Status = (Status)Enum.Parse(typeof(Status), c.Element("Status").Value)
                  })
相关问题