2011-07-07 75 views
-3
<Fruit> 
    <Apple> 
     <Pear>dar</Pear> 
     <Orange/> 
     <Starfruit>har</Starfruit> 
    </Apple> 
    <Lemon> 
     <Melon>yar</Melon> 
     <Lime>blah</Lime> 
    </Lemon> 
<Fruit> 

在此刻我有兩個選擇語句,然後將這兩個單獨的枚舉值存儲到一個對象。我如何解析這個XML在一個linq語句

 var myfruits = from myfruit in document.Descendants("UserAccount") 
        select new 
        { 
         Pear= myfruit.Element("Pear").Value, 
         Starfruit= myfruit.Element("Starfruit").Value, 

        }; 
     var myfruits2 = from myfruit2 in document.Descendants("Product") 
        select new 
        { 
         Melon= myfruit2.Element("Melon").Value, 
         Lime= myfruit2.Element("Lime").Value, 
        }; 
     foreach (var myfruit in myfruits) 
     { 
      megafruit.Pear=myfruit.Pear; 
      megafruit.Starfruit=myfruit.Starfruit; 
     } 
     foreach (var myfruit2 in myfruits2) 
     { 
      megafruit.Melon= myfruit2.Melon; 
      megafruit.Lime= myfruit2.Lime; 
     } 
     return megafruit; 
+3

*枚舉*正在談論什麼?你想從這個字符串中提取什麼信息?我的意思是* string *,因爲這裏顯示的不是有效的XML文件。 XML不能有多個根。你的真實XML是怎樣的? –

+0

你能列出你想存儲這些數據的對象模型的聲明嗎? –

回答

0

當您展開查詢結果(因爲您擁有所有後代節點的集合)時,您可以瀏覽XML文檔。例如:

XDocument document = XDocument.Parse("<Fruit><Apple><Pear>dar</Pear><Orange/><Starfruit>har</Starfruit></Apple><Lemon><Melon>yar</Melon><Lime>blah</Lime></Lemon></Fruit>"); 

var megafruit = (from x in document.Descendants("Fruit") 
       select new 
       { 
        Pear = x.Element("Apple").Element("Pear").Value, 
        Orange = x.Element("Apple").Element("Orange").Value, 
        Starfruit = x.Element("Apple").Element("Starfruit").Value, 
        Melon = x.Element("Lemon").Element("Melon").Value, 
        Lime = x.Element("Lemon").Element("Lime").Value 
       }).SingleOrDefault(); 

這將生成一個匿名類,該類具有用所提供的XML的值填充的屬性。或者,您也可以使用選擇新的Megafruit()而不是僅選擇新的 - 這將創建Megafruit類的新實例,並根據XML設置屬性。

請注意,這是一個非常簡單的例子,假設每個果實出現一次 - 它與我在許多衛星前工作過的東西類似,我知道我得到的數據不會成爲一個集合(就像一個集合梨,橙子或其他),所以我coudl使用SingleOrDefault。