2017-07-07 52 views
2

我想學習如何在C#中用XML保存和提取數據,即使我已經閱讀了關於這裏的類似問題的各種答案,但我無法獲得保留爲什麼我的陳述沒有任何回報。 我正在編寫的程序只是一個測試,其中我已經在xml文檔中保存了關於幾部電影的數據,現在我試圖根據它們的成本檢索其中的一些。用linq搜索Xml文檔不返回任何東西

這是我爲搜索編寫的類:

class ExtractData 
{ 
    private XDocument _xdoc; 
    public List<string> SearchByCost(double cost) 
    { 
     _xdoc = XDocument.Load(FileLocation.XmlFileLocation); 
     List<string> list = new List<string>(); 

     var movies = from movie in _xdoc.Root.Elements("Name") 
       where Convert.ToDouble(movie.Element("Cost").Value) < cost 
       select movie; 

     foreach (var item in movies) 
     { 
      list.Add(item.Value); 
     } 

     return list; 
    } 

} 

這是我正在努力使其打印在控制檯:

 eData = new ExtractData(); 
     foreach (var movie in eData.SearchByCost(9)) 
     { 
      Console.WriteLine(movie); 
     } 

這是XML文檔的內容:

<?xml version="1.0" encoding="utf-8"?> 
<Movies> 
    <Movie> 
    <Id>1</Id> 
    <Name>Shawshank Redemption</Name> 
    <Director>Frank Darabont</Director> 
    <Year>1994</Year> 
    <Cost>9.95</Cost> 
    </Movie> 
    <Movie> 
    <Id>2</Id> 
    <Name>Pulp Fiction</Name> 
    <Director>Quentin Tarantino</Director> 
    <Year>1995</Year> 
    <Cost>8.95</Cost> 
    </Movie> 
    <Movie> 
    <Id>3</Id> 
    <Name>Sharknado</Name> 
    <Director>Anthony Ferrante</Director> 
    <Year>2013</Year> 
    <Cost>5.95</Cost> 
    </Movie> 
</Movies> 

我希望這是足夠的信息來嘗試和幫助我,並提前致謝! :)

+3

您需要調試代碼。另外,'var movies = from _xdoc.Root.Elements(「Name」)中的影片會選擇(可能 - 它可能不會返回任何內容,但如果是的話......)所有元素。然後,您嘗試通過'movie.Element(「Cost」)檢索成本,但元素*沒有任何子元素!! *至少需要將其更改爲_xdoc.Root.Elements (「電影」)'並在末尾做一個'select movie.Elements(「Name」)'或類似的名字,以獲得匹配的所有電影名稱。 – Will

+0

謝謝,我顯然已經把那個linq查詢中的元素名稱混淆了一下。感謝您的幫助:) – sunero4

回答

4

根元素包含Movie元素:

var movies = from movie in _xdoc.Root.Elements("Movie") // here instead of "Name" 
      where (double)movie.Element("Cost") < cost 
      select movie; 

此外,XElement支持顯式鑄造翻番。你可以替換LINQ查詢的第二環(假設你要選擇的電影名):

List<string> list = movies.Select(m => (string)m.Element("Name")).ToList(); 
+1

非常感謝,解決了我的問題! – sunero4

+0

你太善良了,不會花時間回答這個問題。 –

1

用簡單的英語,你似乎在試圖找到電影超過900(有些武斷貨幣)更便宜。

你可以寫爲:

public IReadOnlyCollection<string> SearchByCost(XDocument xdoc, double cost) 
{ 
    return xdoc.Root.Elements("Movie") 
     .Where(movie => (double)movie.Element("Cost") < cost) 
     .Select(movie => movie.Element("Name").Value) 
     .ToList(); 
} 
+0

哈哈呀,確切地說 - 在實際應用中,貨幣和其他東西當然會被指定,但這僅僅是爲了獲得xml的掛起。我真的得到它不僅與名稱工作,但與返回一個MovieDTO的列表,而不是: (哎呀,代碼格式不工作在評論:D但是,是的,它現在的工作原理!感謝您的幫助:) !) – sunero4