遍历XDocument中的每个XElement

时间:2013-03-15 13:29:41

标签: c# linq-to-xml

我有一个如下所示的XML:

<myVal>One</myVal>
<myVal>Two</myVal>
<myVal>Three</myVal>
<myVal>Four</myVal>
<myVal>Five</myVal>

我想将其加载到XDocument中,然后遍历该XDocument中的每个XElement并计算每个元素中的字符数。

这样做的最佳方式是什么?

首先,我注意到我必须添加一个根元素,否则XDocument.Parse()将无法将其解析为XML。所以我补充道:

<span>
        <myVal>One</myVal>
        <myVal>Two</myVal>
        <myVal>Three</myVal>
        <myVal>Four</myVal>
        <myVal>Five</myVal>
</span>

但是当我这样做时:

foreach (XElement el in xDoc.Descendants())

el将包含整个XML,从第一个<span>开始,包括<myVal>的每一个,然后以</span>结尾。

如何使用XDocument遍历每个XML元素(<myVal>One</myVal>等)?

我事先并不知道所有XML元素的名称,因此它们不会总是命名为“myVal”。

2 个答案:

答案 0 :(得分:17)

使用doc.Root.Elements()(对于根节点的直接子节点,我认为它实际上是您想要的)或doc.Root.Descendants()(如果您想要每个后代,包括<myVal/>的任何可能子节点)。

答案 1 :(得分:1)

这样做:

string xml = "  <span><myVal>One</myVal><myVal>Two</myVal><myVal>Three</myVal><myVal>Four</myVal><myVal>Five</myVal></span>";
XmlReader xr = XmlReader.Create(new StringReader(xml));
var xMembers = from members in XElement.Load(xr).Elements() select members;

foreach (XElement x in xMembers)
{
    var nodeValue = x.Value;
}

现在,如果您看到 nodeValue 的值,您将获得One Two等