<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:evnet="http://www.mscommunities.com/rssmodule/"><channel><title>Comment Feed for Parent-Child Tree path to xml (TechOff on Channel 9)</title><atom:link rel="self" type="application/rss+xml" href="http://channel9.msdn.com/forums/techoff/257706-parent-child-tree-path-to-xml/rss/default.aspx" /><image><url>http://mschnlnine.vo.llnwd.net/d1/Dev/App_Themes/C9/images/feedimage.png</url><title>Comment Feed for Parent-Child Tree path to xml (TechOff on Channel 9)</title><link>http://channel9.msdn.com/forums/TechOff/257706-Parent-Child-Tree-path-to-xml/</link></image><description>Parent-Child Tree path to xml</description><link>http://channel9.msdn.com/forums/TechOff/257706-Parent-Child-Tree-path-to-xml/</link><language>en-us</language><pubDate>Wed, 19 Sep 2007 11:27:13 GMT</pubDate><lastBuildDate>Wed, 19 Sep 2007 11:27:13 GMT</lastBuildDate><generator>EvNet (EvNet, Version=1.0.3243.35083, Culture=neutral, PublicKeyToken=null)</generator><item><title>Re: Parent-Child Tree path to xml</title><description>&lt;blockquote&gt;
				&lt;div&gt;dotnetjunkie wrote:&lt;/div&gt;
				&lt;div&gt;In VS2008 you also have the new&amp;nbsp;XDocument / XElement / etc...&amp;nbsp;classes, would these give me any specific benefits?&lt;br /&gt;&lt;/div&gt;
		&lt;/blockquote&gt;
		&lt;br /&gt;XML literals and LINQ in VB9 make this code a heck of lot easier to read (and write too). Here's the quick example I cooked up:&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;Module&lt;/p&gt; Module1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sub Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim doc = &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;nodes&amp;gt;&amp;lt;/nodes&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doc.AddPath("11 &amp;gt; 7 &amp;gt; 2")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doc.AddPath("11 &amp;gt; 7 &amp;gt; 8 &amp;gt; 5")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doc.AddPath("11 &amp;gt; 7 &amp;gt; 8 &amp;gt; 6 &amp;gt; 2")&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doc.Save(Console.Out)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Extension()&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Private Sub AddPath(ByVal doc As XDocument, ByVal path As String)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim components = path.Split("&amp;gt;"c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim elt = doc.Root&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For Each component In components&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim c = component.Trim()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim newElt = (From node In elt.&amp;lt;node&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Where node.@id = c).SingleOrDefault()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If newElt Is Nothing Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newElt = &amp;lt;node id=&amp;lt;%= c %&amp;gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elt.Add(newElt)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elt = newElt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Sub&lt;br /&gt;End Module&lt;/div&gt;&lt;br /&gt;Some things to note: 
&lt;ul&gt;
&lt;li&gt;Option Explicit is on. All the Dim's without types are still strongly typed thanks to type inference. 
&lt;li&gt;The SingleOrDefault() LINQ extension method for IEnumerable(Of T) returns the first element of the list, null if there is none, or throws if it has more than one element (which can never happen in this example). 
&lt;li&gt;Notice how easy it was to create the node and set its id attribute (using a syntax that ASP/ASP.NET developers should already be familiar with). It's much easier to see at a glance what this code is doing than all the method calls in the VB8 sample. 
&lt;li&gt;XDocument.Save uses indenting by default, so this gives pretty output without the need for an XmlWriter. 
&lt;li&gt;No need to learn XPath. ;)
&lt;li&gt;XML literals are VB only. Take that, C#! :P&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;EDIT: Made AddPath an extension method for no good reason. :)&lt;/p&gt;</description><comments></comments><link>http://channel9.msdn.com/forums/TechOff/257706-Parent-Child-Tree-path-to-xml/?CommentID=354011</link><pubDate>Wed, 19 Sep 2007 11:27:13 GMT</pubDate><guid isPermaLink="false">http://channel9.msdn.com/forums/TechOff/257706-Parent-Child-Tree-path-to-xml/?CommentID=354011</guid><evnet:views>0</evnet:views><evnet:viewtrackingurl>http://channel9.msdn.com/354011/WebViewBug.aspx?EVT=0</evnet:viewtrackingurl><evnet:previewtext>	dotnetjunkie wrote:
				In VS2008 you also have the new&amp;nbsp;XDocument / XElement / etc...&amp;nbsp;classes, would these give me any specific benefits?
		
		XML literals and LINQ in VB9 make this code a heck of lot easier to read (and write too). Here's the quick example I cooked up:

Module&amp;#8230;</evnet:previewtext><dc:creator>Sven Groot</dc:creator><slash:comments>0</slash:comments><wfw:commentRss></wfw:commentRss><trackback:ping>http://channel9.msdn.com/354011/Trackback.aspx</trackback:ping></item><item><title>Re: Parent-Child Tree path to xml</title><description>Sven,&lt;br /&gt;&lt;br /&gt;That is fantastic! Thank you so much, you really saved my day :)&lt;br /&gt;&lt;br /&gt;I just implemented your solution in my application, and it works flawlessly!&lt;br /&gt;&lt;br /&gt;I was messing aroung with strings and a custom generic tree class.&lt;br /&gt;Needless to say, using XmlDocument with SelectSingleNode is&amp;nbsp;so much neater, I guess I really have to learn XPath some day (still haven't got the time to delve into that stuff).&lt;br /&gt;&lt;br /&gt;In VS2008 you also have the new&amp;nbsp;XDocument / XElement / etc...&amp;nbsp;classes, would these give me any specific benefits?&lt;br /&gt;</description><comments></comments><link>http://channel9.msdn.com/forums/TechOff/257706-Parent-Child-Tree-path-to-xml/?CommentID=354007</link><pubDate>Wed, 19 Sep 2007 09:01:00 GMT</pubDate><guid isPermaLink="false">http://channel9.msdn.com/forums/TechOff/257706-Parent-Child-Tree-path-to-xml/?CommentID=354007</guid><evnet:views>0</evnet:views><evnet:viewtrackingurl>http://channel9.msdn.com/354007/WebViewBug.aspx?EVT=0</evnet:viewtrackingurl><evnet:previewtext>Sven,That is fantastic! Thank you so much, you really saved my day :)I just implemented your solution in my application, and it works flawlessly!I was messing aroung with strings and a custom generic tree class.Needless to say, using XmlDocument with SelectSingleNode is&amp;nbsp;so much neater, I guess&amp;#8230;</evnet:previewtext><dc:creator>dotnetjunkie</dc:creator><slash:comments>0</slash:comments><wfw:commentRss></wfw:commentRss><trackback:ping>http://channel9.msdn.com/354007/Trackback.aspx</trackback:ping></item><item><title>Re: Parent-Child Tree path to xml</title><description>There's two things you can do. You can create a custom object tree and then&amp;nbsp;serialize that to XML in one go, or create an XML DOM object and populate that. Which you want depend on what else you're going to do with the data. I'm going to assume the XML DOM approach here.&lt;br /&gt;&lt;br /&gt;The basic approach is to split the path string, iterate over the components, check if a node already exists and if not, add it.&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;Private Sub AddPath(ByVal doc As XmlDocument, ByVal path As String)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim components() As String = path.Split("&amp;gt;"c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim elt As XmlElement = doc.DocumentElement&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;For Each component As String In components&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim newElt As XmlElement = CType(elt.SelectSingleNode("node[@id='" &amp;amp; component.Trim() &amp;amp; "']"), XmlElement)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If newElt Is Nothing Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newElt = doc.CreateElement("node")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newElt.SetAttribute("id", component.Trim())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elt.AppendChild(newElt)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elt = newElt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;End Sub&lt;br /&gt;I'm sure there's a ton of ways to make that faster but this should get you started at least.&amp;nbsp;You can then use it like this:&lt;br /&gt;Dim doc As New XmlDocument&lt;br /&gt;' Create XML declaration&lt;br /&gt;doc.AppendChild(doc.CreateXmlDeclaration("1.0", "utf-8", Nothing))&lt;br /&gt;' Create document element&lt;br /&gt;doc.AppendChild(doc.CreateElement("nodes"))&lt;br /&gt;AddPath(doc, "11 &amp;gt; 7 &amp;gt; 2")&lt;br /&gt;AddPath(doc, "11 &amp;gt; 7 &amp;gt; 8 &amp;gt; 5")&lt;br /&gt;AddPath(doc, "11 &amp;gt; 7 &amp;gt; 8 &amp;gt; 6 &amp;gt; 2")&lt;br /&gt;Console.WriteLine(doc.OuterXml)&lt;br /&gt;&lt;br /&gt;If you want to write it to a file but have it nicely indented and stuff, you can do this:&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;Dim settings As New XmlWriterSettings&lt;br /&gt;settings.Indent = True&lt;br /&gt;Using writer As XmlWriter = XmlWriter.Create("foo.xml", settings)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;doc.Save(writer)&lt;br /&gt;End Using</description><comments></comments><link>http://channel9.msdn.com/forums/TechOff/257706-Parent-Child-Tree-path-to-xml/?CommentID=354004</link><pubDate>Wed, 19 Sep 2007 08:19:58 GMT</pubDate><guid isPermaLink="false">http://channel9.msdn.com/forums/TechOff/257706-Parent-Child-Tree-path-to-xml/?CommentID=354004</guid><evnet:views>0</evnet:views><evnet:viewtrackingurl>http://channel9.msdn.com/354004/WebViewBug.aspx?EVT=0</evnet:viewtrackingurl><evnet:previewtext>There's two things you can do. You can create a custom object tree and then&amp;nbsp;serialize that to XML in one go, or create an XML DOM object and populate that. Which you want depend on what else you're going to do with the data. I'm going to assume the XML DOM approach here.The basic approach is to&amp;#8230;</evnet:previewtext><dc:creator>Sven Groot</dc:creator><slash:comments>0</slash:comments><wfw:commentRss></wfw:commentRss><trackback:ping>http://channel9.msdn.com/354004/Trackback.aspx</trackback:ping></item></channel></rss>