Search code examples
c#xelement

How to get XElement's value and not value of all child-nodes?


Sample xml:

<parent>
<child>test1</child>
<child>test2</child>
</parent>

If I look for parent.Value where parent is XElement, I get "test1test2". What I am expecting is "". (since there is no text/value for .

What property of XElement should I be looking for?


Solution

  • When looking for text data in the <parent> element you should look for child nodes that have NodeType properties equal to XmlNodeType.Text. These nodes will be of type XText. The following sample illustrates this:

    var p = XElement
        .Parse("<parent>Hello<child>test1</child>World<child>test2</child>!</parent>");
    
    var textNodes = from c in p.Nodes()
                    where c.NodeType == XmlNodeType.Text
                    select (XText)c;
    
    foreach (var t in textNodes)
    {
        Console.WriteLine(t.Value);
    }
    

    Update: if all you want is the first Text node, if any, here's an example using LINQ method calls instead of query comprehension syntax:

    var firstTextNode = p.Nodes().OfType<XText>().FirstOrDefault();
    if (firstTextNode != null)
    {
        var textValue = firstTextNode.Value;
        ...do something interesting with the value
    }
    

    Note: using First() or FirstOrDefault() will be more performant than Count() > 0 in this scenario. Count always enumerates the whole collection while FirstOrDefault() will only enumerate until a match is found.