2013-07-21 100 views
1

我寫了這個:的LINQ to XML:從查詢到可變

 XDocument doc = XDocument.Load("test.xml"); 
     string nodeName = "Mike"; 
     var query = from el in doc.Descendants("dogs") 
        where (string)el.Attribute("name") == nodeName 
        select 
        "Name: " + nodeName 
        + "\n" + "Breed: " + (string)el.Element("breed") 
        + "\n" + "Sex: " + (string)el.Element("sex"); 
     foreach (string data in query) 
      MessageBox.Show(data); 

因爲我希望加載這個數據,我想將它們放到變量,對以後能夠把他們的文本框,選項框,等等。現在我只知道如何用MessageBox顯示它。

回答

3

如果你指的這個,但你可以嘗試一下不知道

public class XmlResut 
    { 
     public string Name { get; set; } 
     public string Breed { get; set; } 
     public string Sex { get; set; } // Maybe a enum would fit this property better 
    } 

現在你改變了LINQ來創建新實例以選擇新(http://www.dotnetperls.com/select-new

XDocument doc = XDocument.Load("test.xml"); 
    string nodeName = "Mike"; 
    var query = from el in doc.Descendants("dogs") 
       where (string)el.Attribute("name") == nodeName 
       select new XmlResult(){ 
        Name = nodeName, 
        Breed = (string)el.Element("breed") 
        Sex = (string)el.Element("sex") 
       }; 
    foreach (string data in query) 
    { 
     Console.WriteLine(data.Name); 
     Console.WriteLine(data.Breed); 
     Console.WriteLine(data.Sex); 
    } 
+0

爲什麼不能代替序列化? –

+1

@ Ron Sijm:不知道PotatoBox是否會知道序列化,但你可以回答這個問題並向他解釋。我試圖保持它「簡單」。 –

+0

不是我在找的東西,而是從那裏開始解決我的問題,所以這很有幫助,謝謝。 – PotatoBox

1

您可以致電Enumerable.ToList將它們存儲在集合中供以後使用。

創建一個新的公共類:

var result = query.ToList(); 
foreach (string data in result) 
     MessageBox.Show(data); 

//result is available for later use 
1

好吧定義類的,我不知道是否有更好實現我想要的方式,但它的工作原理。

public class Data 
    { 
    public string name { get; set; } 
    public string breed { get; set; } 
    public string sex { get; set; } 
    } 

和方法:

    XDocument doc = XDocument.Load(@"test.xml"); 
        string nodeName = "Mike"; 
        var data = from q in doc.Descendants("dogs") 
        where (string)q.Attribute("name") == nodeName 
         select new Data 
         { 
          name = q.Attribute("name").Value, 
          breed = q.Element("breed").Value, 
          sex = q.Element("sex").Value 
         }; 
        foreach (var element in data) 
        { 
         textBox1.Text = element.name; 
         comboBox1.Text = element.sex; 
         textBox2.Text = element.breed; 
        } 
+1

與@Rand Random解決方案的差異真的很小.. – bAN

+0

嗯,我沒有意識到,但你是對的。我想我會將他的答案標記爲解決方案。 – PotatoBox

+1

起初,我並沒有真正看到差異,唯一不同的是,您現在正在使用正確的.Value屬性(不是所有的時間)。順便說一句,我希望你知道你的文本框/組合框將只保存最後找到的條目,因爲你總是通過枚舉拋出.Text屬性拋出查詢。 –