{"id":4573,"date":"2008-03-19T19:23:00","date_gmt":"2008-03-19T19:23:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vbteam\/2008\/03\/19\/vb-xml-cookbook-recipe-2-descendants-and-ancestors-doug-rothaus\/"},"modified":"2024-07-05T14:32:17","modified_gmt":"2024-07-05T21:32:17","slug":"vb-xml-cookbook-recipe-2-descendants-and-ancestors-doug-rothaus","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/vbteam\/vb-xml-cookbook-recipe-2-descendants-and-ancestors-doug-rothaus\/","title":{"rendered":"VB XML Cookbook, Recipe 2: Descendants and Ancestors (Doug Rothaus)"},"content":{"rendered":"<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">This entry in the cookbook shows how you can access descendant and ancestor elements in an XML document using Visual Basic, XML Axis properties, and LINQ to XML objects.<\/font><\/p>\n<p class=\"MsoNormal\"><b><font size=\"3\"><font face=\"Calibri\">Descendants<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Visual Basic provides <\/font><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/bb384769.aspx\"><font face=\"Calibri\" size=\"3\">XML Axis properties<\/font><\/a><font face=\"Calibri\" size=\"3\"> that enable you to easily refer to child nodes and attributes. As is often the case with XML, you may need to reference sub-elements that show up in different levels of the XML hierarchy. In that case, you can use the <\/font><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/bb384876.aspx\"><font face=\"Calibri\" size=\"3\">XML Descendant axis property<\/font><\/a><font face=\"Calibri\" size=\"3\">.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">The XML Descendant axis property is identified using three periods followed by the XML element that you want to refer to. For example, in the AdventureWorks contacts source document that we used in Recipe 1 (you can download the XML document and related schemas from the <\/font><a href=\"http:\/\/blogs.msdn.com\/vbteam\/archive\/2008\/02\/21\/vb-xml-cookbook-recipe-1-xml-transformations-using-xml-literals-replacing-xsl-for-each-doug-rothaus.aspx\"><font face=\"Calibri\" size=\"3\">Recipe 1<\/font><\/a><font face=\"Calibri\" size=\"3\"> post), there is an <\/font><span>&lt;<span>AdditionalContactInfo&gt;<\/span><\/span><font face=\"Calibri\" size=\"3\"> element that contains information about the contact such as phone numbers, shipping and billing addresses, and so on. The phone numbers in the content of the <\/font><span>&lt;<span>AdditionalContactInfo&gt; <\/span><\/span><font face=\"Calibri\" size=\"3\">element can show up anywhere within the value of the element. As a result, you would need to use the XML Descendant axis property to refer to the phone number elements. For example:<\/font><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN\">Dim<\/span><span lang=\"EN\"> xmlDoc = XDocument.Load(<span>&#8220;AWContacts.xml&#8221;<\/span>)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN\"><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&#8216; Return all descendant &lt;telephoneNumber&gt; elements<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Dim telephoneNumbers = _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>xmlDoc.<span>&lt;<\/span>Contacts<span>&gt;<\/span>.<span>&lt;<\/span>Contact<span>&gt;<\/span>.<span>&lt;<\/span>aci:AdditionalContactInfo<span>&gt;<\/span>&#8230;<span>&lt;<\/span>act:telephoneNumber<span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">The XML descendant axis property returns a collection of all of the matching elements &ldquo;down&rdquo; the XML hierarchy. Let&rsquo;s look at a more complete example. The following Function returns a list of contact names and phone numbers using the XML Descendant axis property.<\/font><\/p>\n<p class=\"MsoNormal\"><span>Imports<\/span><span> <span>&lt;<\/span><span>xmlns<\/span><span>=<\/span><span>&#8220;<\/span><span>http:\/\/SampleSchema\/AWContacts<\/span><span>&#8220;<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>Imports<\/span><span> <span>&lt;<\/span><span>xmlns:s<\/span><span>=<\/span><span>&#8220;<\/span><span>sample-output<\/span><span>&#8220;<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>Imports<\/span><span> <span>&lt;<\/span><span>xmlns:aci<\/span><span>=<\/span><span>&#8220;<\/span><span>http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/adventure-works\/ContactInfo<\/span><span>&#8220;<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>Imports<\/span><span> <span>&lt;<\/span><span>xmlns:act<\/span><span>=<\/span><span>&#8220;<\/span><span>http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/adventure-works\/ContactTypes<\/span><span>&#8220;<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Public<\/span><span> <span>Class<\/span> Recipe2<span><\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>Public<\/span><span> <span>Function<\/span> GetPhoneNumbers(<span>ByVal<\/span> xmlDoc <span>As<\/span> XDocument) <span>As<\/span> XElement<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>Return<\/span> <span>&lt;<\/span><span>s:ContactPhoneNumbers<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>&lt;%=<\/span> <span>From<\/span> contact <span>In<\/span> xmlDoc.<span>&lt;<\/span>Contacts<span>&gt;<\/span>.<span>&lt;<\/span>Contact<span>&gt;<\/span> _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>Where<\/span> contact.<span>&lt;<\/span>aci:AdditionalContactInfo<span>&gt;<\/span>&#8230;<span>&lt;<\/span>act:telephoneNumber<span>&gt;<\/span>.<span>&lt;<\/span>act:number<span>&gt;<\/span>.Count &gt; 0 _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>Select<\/span> <span>&lt;<\/span><span>s:Contact<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>&lt;<\/span><span>s:Name<\/span><span>&gt;<\/span><span>&lt;%=<\/span> contact.<span>&lt;<\/span>FirstName<span>&gt;<\/span>.Value &amp; <span>&#8221; &#8220;<\/span> &amp; _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span>contact.<span>&lt;<\/span>LastName<span>&gt;<\/span>.Value <span>%&gt;<\/span><span>&lt;\/<\/span><span>s:Name<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>&lt;<\/span><span>s:PhoneNumbers<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>&lt;%=<\/span> <span>From<\/span> number <span>In<\/span> _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span>contact.<span>&lt;<\/span>aci:AdditionalContactInfo<span>&gt;<\/span>&#8230;<span>&lt;<\/span>act:telephoneNumber<span>&gt;<\/span>.<span>&lt;<\/span>act:number<span>&gt;<\/span> _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>Select<\/span> <span>&lt;<\/span><span>s:Number<\/span><span>&gt;<\/span><span>&lt;%=<\/span> number.Value <span>%&gt;<\/span><span>&lt;\/<\/span><span>s:Number<\/span><span>&gt;<\/span> _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>%&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>&lt;\/<\/span><span>s:PhoneNumbers<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>&lt;\/<\/span><span>s:Contact<\/span><span>&gt;<\/span> _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;<\/span><span>%&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;<\/span><span>&lt;\/<\/span><span>s:ContactPhoneNumbers<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;<\/span><span>&nbsp;<\/span>End<\/span><span> <span>Function<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>End<\/span><span> <span>Class<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">In XSLT, the same transform would look like the following:<\/font><\/p>\n<p class=\"MsoNormal\"><span>&lt;?<\/span><span>xml<\/span><span> <\/span><span>version<\/span><span>=<\/span><span>&#8216;<span>1.0<\/span>&#8216;<span>?&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;<\/span><span>xsl:stylesheet<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>version<\/span><span>=<\/span><span>&#8220;<span>1.0<\/span>&#8220;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:xsl<\/span><span>=<\/span><span>&#8220;<span>http:\/\/www.w3.org\/1999\/XSL\/Transform<\/span>&#8220;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:aw<\/span><span>=<\/span><span>&#8220;<span>http:\/\/SampleSchema\/AWContacts<\/span>&#8220;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:s<\/span><span>=<\/span><span>&#8220;<span>sample-output<\/span>&#8220;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:aci<\/span><span>=<\/span><span>&#8220;<span>http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/adventure-works\/ContactInfo<\/span>&#8220;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:crm<\/span><span>=<\/span><span>&#8220;<span>http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/adventure-works\/ContactRecord<\/span>&#8220;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:act<\/span><span>=<\/span><span>&#8220;<span>http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/adventure-works\/ContactTypes<\/span>&#8220;<span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;<\/span><span>xsl:output<\/span><span> <\/span><span>method<\/span><span>=<\/span><span>&#8220;<span>xml<\/span>&#8220;<span> <\/span><span>indent<\/span><span>=<\/span>&#8220;<span>yes<\/span>&#8220;<span> \/&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>&lt;<\/span><span>xsl:template<\/span><span> <\/span><span>match<\/span><span>=<\/span><span>&#8220;<span>aw:Contacts<\/span>&#8220;<span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>s:ContactPhoneNumbers<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:apply-templates<\/span><span> <\/span><span>select<\/span><span>=<\/span><span>&#8220;<span>aw:Contact<\/span>&#8220;<span> \/&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>s:ContactPhoneNumbers<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>&lt;\/<\/span><span>xsl:template<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>&lt;<\/span><span>xsl:template<\/span><span> <\/span><span>match<\/span><span>=<\/span><span>&#8220;<span>aw:Contact<\/span>&#8220;<span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:if<\/span><span> <\/span><span>test<\/span><span>=<\/span><span>&#8220;<span>count(aci:AdditionalContactInfo\/\/act:telephoneNumber\/act:number) &gt; 0<\/span>&#8220;<span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>s:Contact<\/span><span><\/span><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This entry in the cookbook shows how you can access descendant and ancestor elements in an XML document using Visual Basic, XML Axis properties, and LINQ to XML objects. Descendants Visual Basic provides XML Axis properties that enable you to easily refer to child nodes and attributes. As is often the case with XML, you [&hellip;]<\/p>\n","protected":false},"author":260,"featured_media":8818,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[192,195],"tags":[59,94,117,163,166,185],"class_list":["post-4573","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-featured","category-visual-basic","tag-doug-rothaus","tag-linqvb9","tag-orcas","tag-vb-xml-cookbook","tag-vb2008","tag-xml"],"acf":[],"blog_post_summary":"<p>This entry in the cookbook shows how you can access descendant and ancestor elements in an XML document using Visual Basic, XML Axis properties, and LINQ to XML objects. Descendants Visual Basic provides XML Axis properties that enable you to easily refer to child nodes and attributes. As is often the case with XML, you [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/4573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/users\/260"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/comments?post=4573"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/4573\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media\/8818"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media?parent=4573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/categories?post=4573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/tags?post=4573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}