2011-12-02 29 views
1

我有一個包含記錄等一個XML文件 -更新XML文件<T>

<?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對象(設置它們的緯度/日誌字段)在上述集合 和處理這些對象後,我想要將這些記錄更新回XML文件。

任何人都可以請指導我一個有效的解決方案,我該如何將這些對象更新回XML文件。

謝謝!

+0

是多少效率對你很重要?你打算處理巨大的XML文件嗎?或者你的意思只是可讀和簡潔的代碼? – svick

+0

好吧,我其實是指所有這些:-)雖然現在XML文件將擁有500個這樣的CLocation元素,但未來可能會跳到1000。而且,簡潔的代碼總是一個加號:-) – iniki

回答

3

你可以做這樣的事情:

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迴文件,或什麼的。

如果您發現效率不夠高,有幾種方法可以加快速度。例如,通過CId創建一個Dictionary元素,以便每次都不搜索整個文檔。

但是,如果你有大文件,將它們全部加載到內存中可能是不可能的或者是一個好主意。使用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) 
        })