Xelement : more Value in that Value !!

Posted Mon, Jan 5 2009 10:56 by bill

XML is very flexible and somewhat permissive in what it allows. Consider this piece of XML:

      el = <item>some values<first>one</first><second>two</second></item>


The element named item can contain both child elements and a text value.  Thankfully this kind of XML is rare: it poses a heap of whitespace formatting issues, and the value itself can reside in any combination of places between the elements, eg:


      el = <item>some values<first>one</first> are <second>two</second>in here</item>


How this is interpreted is questionable. You could argue that position needs to be preserved, in which case you’d work with the Nodes property, including both the nodes of type XElement and also XText. Each of the inline values, “some values”, “ are ” and “in here”  are actually XText nodes. 

If you’re just after the Text, you need to write a helper function.  If you try to use the Value property you get the Value of all nested nodes.  Calling el.Value with the last example will output:

some valuesone are twoin here

The extension I slapped together is :

   <Extension()> _

   Public Function GetText(ByVal el As XElement) As String

      If Not el.HasElements Then Return el.Value

      Dim sb As New StringBuilder

      For Each nd As XNode In el.Nodes

         If TypeOf nd Is XText Then sb.Append(nd.ToString)


      Return sb.ToString

   End Function

With this the output is :

some values are in here

Enjoy :)

Filed under: , , , ,