0

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

4

2 回答 2

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()
      }
    );

类似的东西......假设你的意思是结果是属性。

于 2013-11-01T22:55:57.183 回答
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;
        }
    }

只需要将移动项添加到确定类而不是公共变量,但经过测试并可以看到。

非常“循序渐进”的方式,因此几年后我在查看代码时可以记住这一点。

感谢帮助。

于 2013-11-01T23:19:31.293 回答