LINQ查询从XML解析内容到类

时间:2012-04-03 08:48:07

标签: c# linq

我有一个xml,我试图通过LINQ查询提取一些信息 xml文件的格式如下所示:

<TopNode>
  <Sample name="Tom" id="0" batch="1">
    <Sequences>
      <NextItem id="10">Stand1 &gt;</NextItem>
      <PreviousItem id="9">Stand2 &gt;</PreviousItem>
    </Sequences>
  </Sample>
  <Sample name="Hill" id="1" batch="1">
    <Sequences>
      <NextItem id="1">Stand1 &gt;</NextItem>
      <NextItem id="2">Stand3 &gt;</NextItem>
      <PreviousItem id="3">Stand4 &gt;</PreviousItem>
    </Sequences>
  </Sample>
.
.
.
</TopNode>

我必须从查询中获取NextItemPreviousItem的属性列表。为此,我定义了一个类来获得我的结果。

public class Extract
{
public string name 
{
get;
set;
}
public int _id
{
get;
set;
}
}

LINQ Query(foreach Sample节点,获取类对象中的PreviousItem和NextItem内容):

var EnumerableContent = from item in XElement.Load("file.xml").Elements("NextItem")
              select ???...

问题是如何在上面的查询中为每个Sample节点将数据传递给类对象。
。 其次,上面只会得到NextItem节点。如何为NextItem和PreviousItem编写查询?

修改 总的来说,我必须为每个Sequence节点获取每个节点的IEnumerable,然后从该查询中返回整个IEnumerable。

EDIT2 在这里分配key给了我这个错误。查询以下

var mapping = XDocument.Load("file.xml")
                          .Descendants("Sequences")
                          .Select(n => n.Descendants("PreviousItem")
                              .Union(n.Descendants("NextItem"))
                              .Select(n1 => new Extract { _id = (int)n1.Attribute("id"), Name = n1.Value })
                              ).ToDictionary<IEnumberable<Menu>, int>(key => key._id);//and further converting this dictionary to sorted dictionary (sorted accordign to keys)

3 个答案:

答案 0 :(得分:1)

我不确定我是否理解了这个问题,但您可以轻松地将LINQ中的元素/属性值转换为XML select语句:

var EnumerableContent = from item in XElement.Load("file.xml").Elements("NextItem")
              select new Extract() { name = item.Value, _id = (int)item.Attribute("id") }

答案 1 :(得分:1)

var xDoc = XDocument.Load(....);
var result = xDoc.Descendants("NextItem")
  .Union(xDoc.Descendants("PreviousItem"))
  .Select(n => new {ID = n.Attribute("id").Value, Name =n.Name, Value =n.Value });

<强> - 编辑 -

var result = XDocument.Load(....)
            .Descendants("Sequences")
            .Select(n=> n.Descendants("NextItem")
                 .Union(n.Descendants("PreviousItem"))
                 .Select(n2 => new { ID = n2.Attribute("id").Value, Name = n2.Name, Value = n2.Value })
            );

答案 2 :(得分:0)

嗨,我认为这是你所期待的。

List<XElement> lstXElements = new List<XElement>();
        lstXElements.AddRange(GetDescendants("NextItem"));
        lstXElements.AddRange(GetDescendants("PreviousItem"));

        List<Extract> lstExtract = new List<Extract>();

        foreach (XElement objElement in lstXElements)
        {
            Extract objExtract = new Extract();
            objExtract._id = Convert.ToInt32(objElement.Attribute("id").Value);
            objExtract.name = (objElement.Name).LocalName;
            lstExtract.Add(objExtract);
        }
List<XElement> GetDescendants(string strDescentName)
    {
        return ((XDocument.Load(Server.MapPath("XMLFile1.xml"))
            .Descendants(strDescentName))
            ).ToList<XElement>();
    }