2010-10-06 19 views
0

我想寫一個Windows Phone 7應用程序,它使用xdocument從xml讀取,但我有幾個問題。我試圖用xml linq xdocument在vb.net工作

如果我這樣做:

Dim xml As XDocument = XDocument.Load(e.Result) 
System.Diagnostics.Debug.WriteLine(xml.ToString) 

或者這樣:

System.Diagnostics.Debug.WriteLine(xml.Elements.Value.ToString) 

然後將XML數據輸出到immidiate窗口作爲一個字符串證明存在的數據,但如果我這樣做:

Dim products = From product In xml.Descendants("product") _ 
        Select title = product.Element("title").Value 

For Each product In products 
    System.Diagnostics.Debug.WriteLine("Title" & product.title) 
Next 

我沒有得到product.title,我也沒有得到什麼,當我做這樣的事情:

Dim count As Integer = xml.Descendants("count").Value 

我在做什麼錯? 謝謝。

XML看起來是這樣的:

<productslist> 
    <count>2</count> 
    <products> 
    <product> 
     <productId>1</productId> 
     <title>test item 1 </title> 
     <price>4.99</price> 
     <category> 
      <categoryId>1</categoryId> 
      <categoryName>cat 1</categoryName> 
     </category> 
    </product> 
    <product> 
     <productId>2</productId> 
     <title>test item 2</title> 
     <price>10.99</price> 
     <category> 
      <categoryId>2</categoryId> 
      <categoryName>cat 2</categoryName> 
     </category> 
    </product> 
</productslist> 
+0

當我們不知道文檔是什麼樣的時候,很難知道您做錯了什麼。你能編輯你的問題來包含它嗎? – 2010-10-06 19:45:17

回答

1

你的LINQ語句不伸入一個匿名類型與Title的屬性。你直接得到IEnumerable<string>

試試這個:

Dim products = From product In xml.Descendants("product") _ 
       Select product.Element("title").Value 

For Each product In products 
    Debug.WriteLine("Title: " & product) 
Next 

這就是說,可變products更好名爲titles。如果您想投影爲匿名類型,則需要使用With New { .Prop1 = data, .Prop2 = other }。點必須以每個屬性名稱爲前綴。這裏有一個例子:

Dim products = From product In xml.Descendants("product") _ 
       Select New With { .Title = product.Element("title").Value } 

For Each product In products 
    Debug.WriteLine("Title: " & product.Title) 
Next 

對於你的例子,它似乎並不需要一個匿名類型。如果你有多個屬性投影,那麼它變得有價值。

編輯:迴應您的評論,一個名稱空間可能會附加到您的XML。如果是這樣,你需要引用它來引用任何元素。

如果你的XML有一個命名空間,應該有一個xmlns規定,如:

<productslist xmlns="http://domain.com/namespace"> 

你將不得不修改代碼來獲取命名空間,並與你的元素連接,如下所示:

Dim ns = xml.Root.GetDefaultNamespace() 

Dim products = From product In xml.Descendants(ns + "product") _ 
       Select product.Element(ns + "title").Value 
+0

感謝您的回覆,但我仍然一無所獲。我檢查了products.Count,它返回0,所以對於每個語句甚至不會觸發 – 2010-10-06 21:20:23

+0

@JasperS很奇怪。你可以設置一個斷點並檢查'xml。後裔(「產品」)'確保這些節點被返回?你的XML有沒有機會使用名稱空間,並且不會像上面顯示的那樣出現?命名空間需要作爲元素名稱的前綴。 – 2010-10-06 21:29:53

+0

我不明白你在xml中的命名空間是什麼意思,我沒有用xml很多。你是什​​麼意思前綴元素名稱? – 2010-10-06 21:53:15

0

對不起,我不知道VB,但在C#中此代碼將做 -

var query = doc.Descendants("product").Select(x => new {Title= x.Element("title").Value}); 

      foreach (var item in query) 
      { 
       Console.WriteLine(item.Title); 

      } 

另外你發佈的xml缺少</products>。節點(結束標籤),我希望這只是一個複製粘貼錯誤。