在迭代Xdocument时获取xDocument元素的Child节点

时间:2012-06-14 15:10:25

标签: c# asp.net xml linq linq-to-xml

很抱歉,如果我的问题不清楚。我从xDocument中获得了一堆元素和每个元素的属性。现在我想在每次迭代中获得每个节点的更多死者并迭代它们并获得它们的所有属性。

结构:

<Jobs>
     <Job attr1=val1 attr2=val2 attr3=val3>
          <InnerNode1 InnerAttr1=val6 InnerAttr2=7>
                     <InnerNodeChild1>
                        .........
                     </InnerNodeChild1>
                     <InnerNodeChild2>
                        ............
                     </InnerNodeChild2>
                     <InnerNodeChild3>
                        .......
                     </InnerNodeChild3>
          </InnerNode1>
          <InnerNode2 InnerAttr1=val6 InnerAttr2=7>
                     <InnerNodeChild1>
                        .........
                     </InnerNodeChild1>
                     <InnerNodeChild2>
                        ............
                     </InnerNodeChild2>
                     <InnerNodeChild3>
                        .......
                     </InnerNodeChild3>
          </InnerNode2>
          <InnerNode3 InnerAttr1=val6 InnerAttr2=7>
                     <InnerNodeChild1>
                        .........
                     </InnerNodeChild1>
                     <InnerNodeChild2>
                        ............
                     </InnerNodeChild2>
                     <InnerNodeChild3>
                        .......
                     </InnerNodeChild3>
          </InnerNode3>
     </job>
     <Job attr1=val4 attr2=val5>
          <InnerNode1 InnerAttr1=val6 InnerAttr2=7>
                     <InnerNodeChild1>
                        .........
                     </InnerNodeChild1>
                     <InnerNodeChild2>
                        ............
                     </InnerNodeChild2>
                     <InnerNodeChild3>
                        .......
                     </InnerNodeChild3>
          </InnerNode1>
          <InnerNode2 InnerAttr1=val6 InnerAttr2=7>
                     <InnerNodeChild1>
                        .........
                     </InnerNodeChild1>
                     <InnerNodeChild2>
                        ............
                     </InnerNodeChild2>
                     <InnerNodeChild3>
                        .......
                     </InnerNodeChild3>
          </InnerNode2>
          <InnerNode3 InnerAttr1=val6 InnerAttr2=7>
                     <InnerNodeChild1>
                        .........
                     </InnerNodeChild1>
                     <InnerNodeChild2>
                        ............
                     </InnerNodeChild2>
                     <InnerNodeChild3>
                        .......
                     </InnerNodeChild3>
          </InnerNode3>
     </Job>
     .....
     .....
     .....
     <OtherNodeInSameLevelAsJob>
     </OtherNodeInSameLevelAsJob>
</Jobs>

好的,对于每个作业节点,只有一个 InnerNode1 ,它有自己的属性和内部节点。如果我想从每个InnerNode1获取所有属性和InnerNodeChild,但在通过作业运行时,如下一个示例中所示,我需要做什么?

  XDocument xDoc = XDocument.Load(xDr);
            var Jobs = from Job in xDoc.Descendants("Job")
                       select new {  
                            JobID = Job.Attribute("JobID").Value,
                            JobName = Job.Attribute("JobName").Value,
                            ........
                            ........
                            ........
                        };

然后:

 foreach(var Job in Jobs){
        string JobId = Job.JobID;
        string JobName = job.JobName;
        .........
        .........
        .........
 }

谢谢你, 埃雷兹

2 个答案:

答案 0 :(得分:4)

获取每个InnerNode1非常简单,只需拨打.Descendants("InnerNode1"),您就可以获得每个var innerchilds = xDoc.Descendants("InnerNode1").Select(x => new { JobID = x.Parent.Attribute("JobID").Value, JobName = x.Parent.Attribute("JobName").Value, ... }); 的列表。这是一个可能适合您的示例。我在节点上调用parent来获取其作业名称和id。

{{1}}

答案 1 :(得分:1)

你的意思是在选择内部选择吗?

var Jobs = from Job in xDoc.Descendants("Job")
                   select new {  
                        JobID = Job.Attribute("JobID").Value,
                        JobName = Job.Attribute("JobName").Value,
                        InnerNode = from inner in Job.Elements("InnerNode")
                            select new
                            {
                               Name = inner.Attribute("Name")
                            }
                        ........
                        ........
                        ........
                    };