2013-11-01 16 views
0

我有下面的XML:如何使用後代和LINQ to XML複雜數據得到了兩類

<?xml version="1.0"?> 
<Script> 
<object Id="ID1"> 
    <Expression>EXPR1</Expression> 
    <Result>value="0" action="sleep"</Result> 
    <Result>value="1" action="wakeup"</Result> 
    <Result>value="2" action="shutdown"</Result> 
    <Result>value="3" action="startup"</Result> 
</object> 
<object Id="ID2"> 
    <Expression>EXPR2</Expression> 
    <Result>value="10" action="sleep"</Result> 
    <Result>value="11" action="wakeup"</Result> 
    <Result>value="12" action="shutdown"</Result> 
    <Result>value="13" action="startup"</Result> 
</object> 
</Script> 

我正嘗試抓取數據到這樣一類:

public class Script 

{ 
    public string Id { get; set; } 
    public string Expression { get; set; } 
    public List<ScriptItem> Results { get; set; } 
} 

public class ScriptItem 
{ 
    public string Value { get; set; } 
    public string Action { get; set } 
} 

但我真的很困惑和混亂。

這裏是一個嘗試例如:

var list = from item in xmlDoc.Descendants("object") 
        let id = item.Elements("Id") 
        let expression = item.Elements("Expression") 
        let resultlist = item.Elements("Result") 
        where id != null 
        select new Script 
        { 
         ObjectId = id.ToString(), 
         Expression = expression.ToString(), 
         Results = result.ToList() 
        }; 

我可不是專家LINQ和拉姆達,所以感謝任何形式的幫助。

+0

那些結果標籤應該是屬性嗎? – Magus

+0

你的'Script'對象沒有'ObjectId'屬性... – bump

+0

不應該你的XML看起來更像這樣:' sleep'? – bump

回答

1

我可能會做幾個查詢。

var objects = xmlDoc.Descendants("object"); 
var items = 
    objects 
    .Select(item => 
     new Script 
     { 
     Id = item.Attribute("Id").Value, 
     Expression = item.Descendant("Expression").Content.Value, 
     Results = 
      item 
      .Elements("Result") 
      .Select(result => 
       new ScriptItem 
       { 
       Value = result.Attribute("Value").Value, 
       Action = result.Attribute("Action").Value 
       } 
      ) 
      .ToList() 
     } 
    ); 

類似的東西...假設你的意思是結果是屬性。

+0

可能這需要2個查詢。一個獲得腳本,一個獲得腳本itens ...但不能讓它工作。 – Mendes

+0

我還沒有測試過這個,並且假設結果應該是''表單,但是它可能會起作用。 – Magus

+0

幫助我找到解決方案。謝謝。 – Mendes

0

bump和Alex幫我找出瞭解決問題的方法。

最終的XML代碼:

<?xml version="1.0"?> 
<Script> 
<Object> 
    <Id>ID1</Id> 
    <Expression>EXPR1</Expression> 
    <Result> 
     <Value>0</Value> 
     <Action>sleep</Action> 
    </Result> 
    <Result> 
     <Value>1</Value> 
     <Action>wakeup</Action> 
    </Result> 
    <Result> 
     <Value>2</Value> 
     <Action>shutdown</Action> 
    </Result> 
    <Result> 
     <Value>3</Value> 
     <Action>startup</Action> 
    </Result> 
</Object> 
</AnimationScript> 

然後代碼:

var objectList = xmlDoc.Descendants("Object") 
        .Select(item => item); 

    foreach (var item in objectList) 
    { 
     string id = item.Element("Id").Value; 
     string expression = item.Element("Expression").Value; 
     var results = item.Descendants("Result").Select(result => result); 

     foreach (var result in results) 
     { 
      string value = result.Element("Value").Value; 
      string action = result.Element("Action").Value; 
     } 
    } 

只需要移動itens添加到最終的類,而不是常見的變量,但測試和作用似乎確定。

非常'一步一步'的方式,讓我可以記住從現在開始的幾年,當看代碼。

感謝您的幫助。

+0

您的選擇不做任何事情。選擇將對象映射到另一個對象。你的代碼中的兩個選擇都會說'如果你看到一個項目,我想要它!'你可以刪除它們,或者使用它們而不是foreach,這是我答案的基礎。 – Magus