我有一个包含 -
等记录的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文件。
答案 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
个元素,这样每次都不会搜索整个文档。
但是如果你有大文件,将它们整个加载到内存中可能是不可能的或者是个好主意。使用XmlReader
和XmlWriter
适用于任何规模的文件,但它们并不易于使用。
另一个需要考虑的选择是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)
})