2012-02-16 101 views
1

所以我根本不願意發佈它,因爲已經有無限的文檔。它已經2年了,我碰到了LINQ,現在它開始挖掘我。經過3個小時的連續嘗試和失敗,我決定做我不願意做的事情。發佈到SO。通過linq從XML獲得價值

我有這樣的XML

<TopMost xmlns="http://abc.com/"> 
    <Mine>MyName</Mine> 
    <Hello> 
     <File>SIMPLE</File> 
     <Book>20</Book> 
     <Copy>0</Copy> 
    </Hello> 
</TopMost> 

我只是想獲得的 「文件」 的價值觀, 「尚書」, 「複製」。並希望將其與單元測試中的某些內容進行比較。

我達到了這個高達:

string result = string.Empty; 
const string path = @"C:\Library.xml"; 
XDocument xdoc = XDocument.Load(path); 

var lv1s = from paper in xdoc.Descendants("Hello") 
    select new 
     { 
      fileP = paper.Element("File").Value, 
      bookP = paper.Element("Book").Value, 
      copyP = paper.Element("Copy").Value, 
     }; 
result += lv1s.fileP + lv1s.bookP + lv1s.copyP; // Error 
MessageBox.Show(result); 

錯誤:序列不包含任何元素

我知道必須有周圍一個簡單的方法,我從它很遠。我有很多這樣的代碼片段,我嘗試過並且失敗了。

編輯

var lv1s = from paper in xdoc.Descendants(ns + "Hello") 
    select new 
     { 
      fileP = paper.Element(ns + "File").Value, 
      bookP = paper.Element(ns + "Book").Value, 
      copyP = paper.Element(ns + "Copy").Value, 
     }; 

我收到編譯錯誤。

Error: The Name ns doex not exist in current context. 
+0

我假設發票==紙或反之亦然? – 2012-02-16 10:50:16

+0

它的紙.......對不起 – Sandy 2012-02-16 10:52:51

回答

5

你需要指定namespcae:

XNamespace ns = "http://abc.com/"; // or: doc.Root.GetDefaultNamespace() 

var lv1s = from paper in xdoc.Descendants(ns + "Hello") 
    select new 
     { 
      fileP = paper.Element(ns +"File").Value, 
      bookP = paper.Element(ns +"Book").Value, 
      copyP = paper.Element(ns +"Copy").Value, 
     }; 

不要試圖使用string nsvar ns

+0

'ns'意味着''ns「'.....我的VS 2010無法解析'ns' – Sandy 2012-02-16 10:50:32

+1

@rapsalands:它是'XNamespace',沒有大寫* S * 。 – 2012-02-16 10:52:09

+0

發佈不起作用的代碼(添加到問題的結尾)。 – 2012-02-16 10:56:59