【问题标题】:Getting Child nodes of an xDocument element while itereating through the Xdocument在遍历 Xdocument 时获取 xDocument 元素的子节点
【发布时间】:2012-06-17 15:54:57
【问题描述】:

对不起,如果我的问题不清楚。我从 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>

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

  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;
        .........
        .........
        .........
 }

谢谢你, 埃雷兹

【问题讨论】:

  • 只是为了确定。您想要一个仅包含 InnerNode1 和 InnerNode1 子属性的 Jobs 列表?

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


【解决方案1】:

获取每个InnerNode1 非常简单,您只需调用.Descendants("InnerNode1"),您就会得到每个.Descendants("InnerNode1") 的列表。这是一个可能对您有用的示例。我在节点上调用 parent 以获取其作业名称和 ID。

var innerchilds = xDoc.Descendants("InnerNode1").Select(x => new {
    JobID = x.Parent.Attribute("JobID").Value,
    JobName = x.Parent.Attribute("JobName").Value,
    ...
    });

【讨论】:

    【解决方案2】:

    你的意思是选择里面的选择吗?

    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")
                                }
                            ........
                            ........
                            ........
                        };
    

    【讨论】:

    • 嘿,很好,谢谢,但我仍然有问题....在您的回答中,您返回一个名为 inner 的 xelement 并且每个内部都有它的属性。我需要获取每个内部的内部子级及其属性...我知道它应该直截了当,只需进行另一个选择,但是内部子级选择返回空字符串或空字符串,我在尝试时一直遇到异常使用它......正如我之前所展示的,innerNodes 和 innerChilds 并不总是与兄弟姐妹的数量相同,有时甚至是空的。并想过这个? 10 倍 :-)
    • 我很高兴它有帮助!也许也看看这个:stackoverflow.com/questions/4989686/…
    • 您始终可以在选择中进行错误检查。例如,将 Job.Attribute("JobName") 替换为: Job.Attribute("JobName") == null ? string.Empty : Job.Attribute("JobName").Value
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多