如何使用Descendants和LINQ将复杂的XML数据传递给两个类

时间:2013-11-01 22:38:02

标签: c# xml linq lambda

我有以下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和lambda的专家,所以感谢任何帮助。

2 个答案:

答案 0 :(得分: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()
      }
    );

类似的东西......假设你认为结果是属性。

答案 1 :(得分:0)

碰撞和亚历克斯帮助我找到解决方案。

最终的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添加到确定的类而不是公共变量,但是测试和搜索确定。

非常'一步一步'的方式,这样我几年后就能记住这个代码。

感谢您的帮助。