2014-03-13 82 views
1

存儲信息我寫這將需要約文件的快速索引和存儲信息的應用程序。我目前使用XML使用此代碼來存儲信息:的最佳方式,搜索和C#

 XmlTextWriter xtw; 
     xtw = new XmlTextWriter(FilePath, Encoding.UTF8); 
     xtw.WriteStartDocument(); 
     xtw.WriteStartElement("ApplicationIndex"); 
     xtw.WriteEndElement(); 
     xtw.Close(); 

     XmlDocument xd = new XmlDocument(); 
     FileStream lfile = new FileStream(FilePath, FileMode.Open); 
     xd.Load(lfile); 
     XmlElement cl = xd.CreateElement("Application"); 
     cl.SetAttribute("Name", ApplicationName); 
     XmlElement na = xd.CreateElement("Path"); 
     XmlText natext = xd.CreateTextNode(ApplicationPath); 
     na.AppendChild(natext); 
     cl.AppendChild(na); 
     XmlElement na1 = xd.CreateElement("UseCount"); 
     XmlText natext1 = xd.CreateTextNode("0"); 
     na1.AppendChild(natext1); 
     cl.AppendChild(na1); 
     XmlElement na2 = xd.CreateElement("SearchTerm"); 
     XmlText natext2 = xd.CreateTextNode(ApplicationName.ToLower()); 
     na2.AppendChild(natext2); 
     cl.AppendChild(na2); 
     xd.DocumentElement.AppendChild(cl); 
     lfile.Close(); 
     xd.Save(FilePath); 

這工作正常創建文件和存儲數據,但是我無法通過數據檢索快有幾百個節點在文件中。我已經使用LINQ to XML來實現這個使用此代碼嘗試:

 listBox1.Items.Clear(); 
     var doc = XDocument.Load(filePath); 
     foreach (var child in doc.Descendants("SearchTerm")) 
     { 
      if (child.Value.Contains(textBox1.Text.ToLower())) 
      { 
       listBox1.Items.Add(child.Value); 
      } 
     } 

這是非常快的,但是我似乎無法獲得有關所選節點的任何信息。例如,我想根據UseCount對返回的結果進行排序(計數越高,列表越高)。無論如何要用XML或其他技術來達到這個目的呢?

這是XML文件的樣子:

<?xml version="1.0" encoding="utf-8"?> 
<ApplicationIndex> 
    <Application Name="Google Chrome"> 
    <Path>C:\Program Files\Google\Chrome\Chrome.exe</Path> 
    <UseCount>0</UseCount> 
    <SearchTerm>google chrome</SearchTerm> 
    </Application> 
    <Application Name="Mozilla Firefox"> 
    <Path>C:\Program Files\Mozilla\Firefox\Firefox.exe</Path> 
    <UseCount>0</UseCount> 
    <SearchTerm>mozilla firefox</SearchTerm> 
    </Application> 
</ApplicationIndex> 
+1

可以顯示xml結構嗎? –

回答

3

您可以按UseCount的元素降序順序是這樣的:

var doc = XDocument.Load(filePath); 
var elements = doc.Descendants("Application") 
       .OrderByDescending(x => (int)x.Element("UseCount")); 

爲了尋找被賦予了創紀錄SearchTerm您可以執行以下操作:

var element = doc.Descendants("Application") 
      .FirstOrDefault(x => (string)x.Element("SearchTerm") == value); 

if(element != null) 
{ 
    // record found 
} 
+0

謝謝,這可行,但搜索位需要我輸入整個短語。有沒有辦法搜索該值是否包含搜索詞? –

+0

@KieranCrown嘗試'... x.Element(「SearchTerm」)。Contains(value));' –

+0

得到此錯誤:Error 'System.Xml.Linq.XElement'不包含'Contains '和最佳推廣方法重載 'System.Linq.ParallelEnumerable.Contains (System.Linq.ParallelQuery ,TSource)' 有一些無效參數 –

相關問題