Friday, 21 February 2014

Degrees Minutes and Decimal Seconds (MapInfo Mapbasic SQL Query)

This is just a quick post to show you how to add use MapBasic functions inside an SQL query in MapInfo to return Latitude and Longitude in Degrees Minutes and Decimal Seconds (DMS).

Just copy the code below into your MapBasic window and modify the sections highlighted to create a query table with columns displaying DMS. Feel free to add as many columns separating with a comma (,).


SELECT
      Col1,
      Col2,
      Fix(CentroidY(obj)) & "°" &
      Fix((Abs(CentroidY(obj)) - Abs(Fix(CentroidY(obj))))*60) & "'" &
      Round(((((Abs(CentroidY(obj)) - Abs(Fix(CentroidY(obj))))*60) - Fix((Abs(CentroidY(obj)) - Abs(Fix(CentroidY(obj))))*60)) * 60),0.01) & Chr$(34) "Latitude_DMS",      
      Fix(CentroidX(obj)) & "°" &
      Fix((CentroidX(obj) - Fix(CentroidX(obj)))*60) & "'" &
      Round(((((CentroidX(obj) - Fix(CentroidX(obj)))*60) - Fix((CentroidX(obj) - Fix(CentroidX(obj)))*60))*60),0.01) & Chr$(34) "Longitude_DMS"
FROM Table_Name
INTO
Result_Table_Name

BROWSE
* FROM Result_Table_Name

COL1COL2Latitude_DMSLongitude_DMS
Value 11-26°27'52.4"149°0'15.54"
Value 22-26°28'3.66"148°59'47.76"
Value 33-26°28'2.72"148°59'51.7"
Value 44-26°28'10.89"148°59'47.51"
Value 55 -26°30'29.1"148°58'55.66"

Wednesday, 12 February 2014

Mapbasic Button Icon Reference

Below is a list of icon constants for Mapbasic.

Here is an example implementation. 

    Create ButtonPad "Example" As
           
PushButton
           
HelpMsg "\nExample Buttton"
           
Calling ExampleSub
           
Icon MI_ICON_ARROW
           
Show


Icon Constant ID
Main
Main MI_ICON_ARROW 0
MI_ICON_SEARCH_RECT 1
MI_ICON_SEARCH_RADIUS 2
MI_ICON_SEARCH_BDY 3
MI_ICON_ZOOM_IN 4
MI_ICON_ZOOM_OUT 5
MI_ICON_ZOOM_QUESTION 6
MI_ICON_GRABBER 7
MI_ICON_INFO 8
MI_ICON_LABEL 9
MI_ICON_LAYERS 10
MI_ICON_RULER 11
MI_ICON_LEGEND 12
MI_ICON_STATISTICS 13
MI_ICON_DISTRICT_MANY 14
MI_ICON_DISTRICT_SAME 15
Drawing
Drawing MI_ICON_SYMBOL 16
MI_ICON_LINE 17
MI_ICON_POLYLINE 18
MI_ICON_ARC 19
MI_ICON_POLYGON 20
MI_ICON_ELLIPSE 21
MI_ICON_RECT 22
MI_ICON_ROUND_RECT 23
MI_ICON_TEXT 24
MI_ICON_WINDOW_FRAME 25
MI_ICON_RESHAPE 26
MI_ICON_ADD_NODE 27
MI_ICON_SYMBOL_STYLE 28
MI_ICON_LINE_STYLE 29
MI_ICON_REGION_STYLE 30
MI_ICON_TEXT_STYLE 31
Tools
Tools MI_ICON_RUN 32
MI_ICON_WRENCH 33
MI_ICON_CROSSHAIR 34
MI_ICON_CLIP_MODE 35
MI_ICON_CLIP_REGION 36
MI_ICON_DRAG_HANDLE 37
Standard
Standard MI_ICON_NEW_DOC 38
MI_ICON_OPEN_FILE 39
MI_ICON_SAVE_FILE 40
MI_ICON_PRINT 41
MI_ICON_CUT 42
MI_ICON_COPY 43
MI_ICON_PASTE 44
MI_ICON_UNDO 45
MI_ICON_HELP 46
Arrows
Arrows MI_ICON_ARROW_1 47
MI_ICON_ARROW_2 48
MI_ICON_ARROW_3 49
MI_ICON_ARROW_4 50
MI_ICON_ARROW_5 51
MI_ICON_ARROW_6 52
MI_ICON_ARROW_7 53
MI_ICON_ARROW_8 54
MI_ICON_ARROW_9 55
MI_ICON_ARROW_10 56
MI_ICON_ARROW_11 57
MI_ICON_ARROW_12 58
MI_ICON_ARROW_13 59
MI_ICON_ARROW_14 60
MI_ICON_ARROW_15 61
MI_ICON_ARROW_16 62
MI_ICON_ARROW_17 63
MI_ICON_ARROW_18 64
MI_ICON_ARROW_19 65
MI_ICON_ARROW_20 66
MI_ICON_ARROW_21 67
Communication
Communication MI_ICON_COMMUNICATION_1 68
MI_ICON_COMMUNICATION_2 69
MI_ICON_COMMUNICATION_3 70
MI_ICON_COMMUNICATION_4 71
MI_ICON_COMMUNICATION_5 72
MI_ICON_COMMUNICATION_6 73
MI_ICON_COMMUNICATION_7 74
MI_ICON_COMMUNICATION_8 75
MI_ICON_COMMUNICATION_9 76
MI_ICON_COMMUNICATION_10 77
MI_ICON_COMMUNICATION_11 78
MI_ICON_COMMUNICATION_12 79
Emergency
Emergency MI_ICON_EMERGENCY_1 80
MI_ICON_EMERGENCY_2 81
MI_ICON_EMERGENCY_3 82
MI_ICON_EMERGENCY_4 83
MI_ICON_EMERGENCY_5 84
MI_ICON_EMERGENCY_6 85
MI_ICON_EMERGENCY_7 86
MI_ICON_EMERGENCY_8 87
MI_ICON_EMERGENCY_9 88
MI_ICON_EMERGENCY_10 89
MI_ICON_EMERGENCY_11 90
MI_ICON_EMERGENCY_12 91
MI_ICON_EMERGENCY_13 92
MI_ICON_EMERGENCY_14 93
MI_ICON_EMERGENCY_15 94
MI_ICON_EMERGENCY_16 95
MI_ICON_EMERGENCY_17 96
MI_ICON_EMERGENCY_18 97
Letters
Letters MI_ICON_LETTERS_A 98
MI_ICON_LETTERS_A 98
MI_ICON_LETTERS_B 99
MI_ICON_LETTERS_C 100
MI_ICON_LETTERS_D 101
MI_ICON_LETTERS_E 102
MI_ICON_LETTERS_F 103
MI_ICON_LETTERS_G 104
MI_ICON_LETTERS_H 105
MI_ICON_LETTERS_I 106
MI_ICON_LETTERS_J 107
MI_ICON_LETTERS_K 108
MI_ICON_LETTERS_L 109
MI_ICON_LETTERS_M 110
MI_ICON_LETTERS_N 111
MI_ICON_LETTERS_O 112
MI_ICON_LETTERS_P 113
MI_ICON_LETTERS_Q 114
MI_ICON_LETTERS_R 115
MI_ICON_LETTERS_S 116
MI_ICON_LETTERS_T 117
MI_ICON_LETTERS_U 118
MI_ICON_LETTERS_V 119
MI_ICON_LETTERS_W 120
MI_ICON_LETTERS_X 121
MI_ICON_LETTERS_Y 122
MI_ICON_LETTERS_Z 123
Maps
Maps MI_ICONS_MAPS_1 124
MI_ICONS_MAPS_2 125
MI_ICONS_MAPS_3 126
MI_ICONS_MAPS_4 127
MI_ICONS_MAPS_5 128
MI_ICONS_MAPS_6 129
MI_ICONS_MAPS_7 130
MI_ICONS_MAPS_8 131
MI_ICONS_MAPS_9 132
MI_ICONS_MAPS_10 133
MI_ICONS_MAPS_11 134
MI_ICONS_MAPS_12 135
MI_ICONS_MAPS_13 136
MI_ICONS_MAPS_14 137
MI_ICONS_MAPS_15 138
Symbols
Symbols MI_ICON_MAPSYMB_1 139
MI_ICON_MAPSYMB_2 140
MI_ICON_MAPSYMB_3 141
MI_ICON_MAPSYMB_4 142
MI_ICON_MAPSYMB_5 143
MI_ICON_MAPSYMB_6 144
MI_ICON_MAPSYMB_7 145
MI_ICON_MAPSYMB_8 146
MI_ICON_MAPSYMB_9 147
MI_ICON_MAPSYMB_10 148
MI_ICON_MAPSYMB_11 149
MI_ICON_MAPSYMB_12 150
MI_ICON_MAPSYMB_13 151
MI_ICON_MAPSYMB_14 152
MI_ICON_MAPSYMB_15 153
MI_ICON_MAPSYMB_16 154
MI_ICON_MAPSYMB_17 155
MI_ICON_MAPSYMB_18 156
MI_ICON_MAPSYMB_19 157
MI_ICON_MAPSYMB_20 158
MI_ICON_MAPSYMB_21 159
MI_ICON_MAPSYMB_22 160
MI_ICON_MAPSYMB_23 161
MI_ICON_MAPSYMB_24 162
MI_ICON_MAPSYMB_25 163
MI_ICON_MAPSYMB_26 164
Maritime
Maritime MI_ICON_MARITIME_1 165
MI_ICON_MARITIME_2 166
MI_ICON_MARITIME_3 167
MI_ICON_MARITIME_4 168
MI_ICON_MARITIME_5 169
MI_ICON_MARITIME_6 170
MI_ICON_MARITIME_7 171
MI_ICON_MARITIME_8 172
MI_ICON_MARITIME_9 173
MI_ICON_MARITIME_10 174
MapBasic
MapBasic MI_ICON_MB_1 175
MI_ICON_MB_2 176
MI_ICON_MB_3 177
MI_ICON_MB_4 178
MI_ICON_MB_5 179
MI_ICON_MB_6 180
MI_ICON_MB_7 181
MI_ICON_MB_8 182
MI_ICON_MB_9 183
MI_ICON_MB_10 184
MI_ICON_MB_11 185
MI_ICON_MB_12 186
MI_ICON_MB_13 187
MI_ICON_MB_14 188
Miscellaneous
Miscellaneous MI_ICON_MISC_1 189
MI_ICON_MISC_2 190
MI_ICON_MISC_3 191
MI_ICON_MISC_4 192
MI_ICON_MISC_5 193
MI_ICON_MISC_6 194
MI_ICON_MISC_7 195
MI_ICON_MISC_8 196
MI_ICON_MISC_9 197
MI_ICON_MISC_10 198
MI_ICON_MISC_11 199
MI_ICON_MISC_12 200
MI_ICON_MISC_13 201
MI_ICON_MISC_14 202
MI_ICON_MISC_15 203
MI_ICON_MISC_16 204
MI_ICON_MISC_17 205
MI_ICON_MISC_18 206
MI_ICON_MISC_19 207
MI_ICON_MISC_20 208
MI_ICON_MISC_21 209
MI_ICON_MISC_22 210
MI_ICON_MISC_23 211
MI_ICON_MISC_24 212
MI_ICON_MISC_25 213
MI_ICON_MISC_26 214
MI_ICON_MISC_27 215
MI_ICON_MISC_28 216
MI_ICON_MISC_29 217
MI_ICON_MISC_30 218
MI_ICON_MISC_31 219
Numbers
Numbers MI_ICON_NUMBERS_1 220
MI_ICON_NUMBERS_2 221
MI_ICON_NUMBERS_3 222
MI_ICON_NUMBERS_4 223
MI_ICON_NUMBERS_5 224
MI_ICON_NUMBERS_6 225
MI_ICON_NUMBERS_7 226
MI_ICON_NUMBERS_8 227
MI_ICON_NUMBERS_9 228
MI_ICON_NUMBERS_10 229
MI_ICON_NUMBERS_11 230
MI_ICON_NUMBERS_12 231
MI_ICON_NUMBERS_13 232
MI_ICON_NUMBERS_14 233
MI_ICON_NUMBERS_15 234
MI_ICON_NUMBERS_16 235
MI_ICON_NUMBERS_17 236
MI_ICON_NUMBERS_18 237
MI_ICON_NUMBERS_19 238
MI_ICON_NUMBERS_20 239
MI_ICON_NUMBERS_21 240
MI_ICON_NUMBERS_22 241
MI_ICON_NUMBERS_23 242
MI_ICON_NUMBERS_24 243
MI_ICON_NUMBERS_25 244
MI_ICON_NUMBERS_26 245
MI_ICON_NUMBERS_27 246
MI_ICON_NUMBERS_28 247
MI_ICON_NUMBERS_29 248
MI_ICON_NUMBERS_30 249
MI_ICON_NUMBERS_31 250
MI_ICON_NUMBERS_32 251
Real Estate
Real Estate MI_ICON_REALESTATE_1 252
MI_ICON_REALESTATE_2 253
MI_ICON_REALESTATE_3 254
MI_ICON_REALESTATE_4 255
MI_ICON_REALESTATE_5 256
MI_ICON_REALESTATE_6 257
MI_ICON_REALESTATE_7 258
MI_ICON_REALESTATE_8 259
MI_ICON_REALESTATE_9 260
MI_ICON_REALESTATE_10 261
MI_ICON_REALESTATE_11 262
MI_ICON_REALESTATE_12 263
MI_ICON_REALESTATE_13 264
MI_ICON_REALESTATE_14 265
MI_ICON_REALESTATE_15 266
MI_ICON_REALESTATE_16 267
MI_ICON_REALESTATE_17 268
MI_ICON_REALESTATE_18 269
MI_ICON_REALESTATE_19 270
MI_ICON_REALESTATE_20 271
MI_ICON_REALESTATE_21 272
MI_ICON_REALESTATE_22 273
MI_ICON_REALESTATE_23 274
Signs
Signs MI_ICON_SIGNS_1 275
MI_ICON_SIGNS_2 276
MI_ICON_SIGNS_3 277
MI_ICON_SIGNS_4 278
MI_ICON_SIGNS_5 279
MI_ICON_SIGNS_6 280
MI_ICON_SIGNS_7 281
MI_ICON_SIGNS_8 282
MI_ICON_SIGNS_9 283
MI_ICON_SIGNS_10 284
MI_ICON_SIGNS_11 285
MI_ICON_SIGNS_12 286
MI_ICON_SIGNS_13 287
MI_ICON_SIGNS_14 288
MI_ICON_SIGNS_15 289
MI_ICON_SIGNS_16 290
MI_ICON_SIGNS_17 291
MI_ICON_SIGNS_18 292
MI_ICON_SIGNS_19 293
Transport
Transport MI_ICON_TRANSPORT_1 294
MI_ICON_TRANSPORT_2 295
MI_ICON_TRANSPORT_3 296
MI_ICON_TRANSPORT_4 297
MI_ICON_TRANSPORT_5 298
MI_ICON_TRANSPORT_6 299
MI_ICON_TRANSPORT_7 300
MI_ICON_TRANSPORT_8 301
MI_ICON_TRANSPORT_9 302
MI_ICON_TRANSPORT_10 303
MI_ICON_TRANSPORT_11 304
MI_ICON_TRANSPORT_12 305
MI_ICON_TRANSPORT_13 306
MI_ICON_TRANSPORT_14 307
MI_ICON_TRANSPORT_15 308
MI_ICON_TRANSPORT_16 309
MI_ICON_TRANSPORT_17 310
MI_ICON_TRANSPORT_18 311
MI_ICON_TRANSPORT_19 312
MI_ICON_TRANSPORT_20 313
MI_ICON_TRANSPORT_21 314
MI_ICON_TRANSPORT_22 315
MI_ICON_TRANSPORT_23 316
MI_ICON_TRANSPORT_24 317
MI_ICON_TRANSPORT_25 318
MI_ICON_TRANSPORT_26 319
MI_ICON_TRANSPORT_27 320
ODBC
ODBC MI_ICON_ODBC_OPEN 321
MI_ICON_ODBC_REFRESH 322
MI_ICON_ODBC_UNLINK 323
MI_ICON_ODBC_MAPPABLE 324
MI_ICON_ODBC_SYMBOL 325
Compas
Compas MI_ICON_COMPASS_EXPAND 326
MI_ICON_COMPASS_CONTRACT 327
MI_ICON_COMPASS_TAG 328
MI_ICON_COMPASS_UNTAG 329
MI_ICON_COMPASS_CIRCLE_TA 330
MI_ICON_COMPASS_POLY_TA 331
Other
Other MI_ICON_SEARCH_POLYGON 332
MI_ICON_UNSELECT_ALL 333
MI_ICON_GRAPH_SELECT 334
MI_ICON_ODBC_DISCONNECT 335
MI_ICON_HOT_LINK 336
MI_ICON_INVERTSELECT 337
MI_ICON_OPENWMS 338
MI_ICON_OPENWFS 339
MI_ICON_OPEN_WOR 340
MI_ICON_SAVE_WIN 341
MI_ICON_SAVE_WOR 342
MI_ICON_CLOSE_ALL 343
MI_ICON_ADORNMENT 344
MI_ICON_PRINT_PDF 345
MI_ICON_SCALEBAR 346
MI_ICON_BING_AERIAL 347
MI_ICON_BING_HYBRID 348
MI_ICON_CATALOG_BROWSER 349
MI_ICON_VIEW_CATALOG_RECORD 350
MI_ICON_PBBI_DATA_CATALOG 351
MI_ICON_CREATE_CATALOG_RECORD 352
MI_ICON_ADD_BASEMAP 353
MI_ICON_ADD_FAVORITE 354
MI_ICON_TABLE_LIST 355
MI_ICON_BING_ROADS 356
MI_ICON_BING_MOVE_MAP_TO 357
MI_ICON_EDIT_METADATA_REC 358
MI_ICON_FILTER 359
MI_ICON_SORT 360
MI_ICON_VIEW_METADATA_REC 361
MI_ICON_VINTAGE_METADATA 362
MI_ICON_ADDTOLIBRARY 363
MI_ICON_OSM_ROADS 364
MI_ICON_NAMED_VIEWS 365

Monday, 10 February 2014

XML, XPath and Mapbasic: A dynamic Menu from configuration

If you have found this page, there is a good chance you have been searching for an example of how to use the XML library that is not well documented for use in MapBasic.

In this example I will show you how to read an XML file using Xpath and the XMLlib library in MapBasic. Currently the XMLLib does not have functionality to re-serialize an xml object so there is no ability to modify or create XML. There are work arounds for this which I could detail in a later post if requested, but if you have complex XML it would be advised that you create your own dll that allows you to serialize and de-serialize XML.

This example also shows a really useful way to drive menus in Mapbasic from configuration. I have personally used similar code to this to drive menus based on a user privilege and context.


The example code can be downloaded here XML Example.zip


'Note the order of the includes

Include "MAPBASIC.DEF"

Include "XMLTypes.def"
Include "XMLLib.def"

Declare Sub Main
Declare Function LoadConfig() as Logical

Declare Sub ShowMenu
Declare Sub AdminUser
Declare Sub GeneralUser
Declare Sub AboutExample
Declare Sub ExitExample

Define CONFIG_FILE "XMLexample.config.xml" 

Type MenuType  
   MenuName as String
   MenuItemName() as String
   MenuItemCallingSub() as String
End Type

Dim
Mnu as MenuType
'-------------------------------------------------------------------

Sub Main
OnError Goto
CatchExPrint Chr$(12)

   'This could be called at any time from anywhere but in this example
   'it initializes the menu at mbx start up

   If LoadConfig() Then
      Call ShowMenu  
   End If


Done:  
   Exit Sub

CatchEx:   Note Error$()
   Resume Done
End Sub
'-------------------------------------------------------------------
Function LoadConfig() as Logical
OnError Goto CatchEx
LoadConfig = false

   'First check and see if xml file exists
   If NOT FileExists(ApplicationDirectory$() & CONFIG_FILE) Then
      Note "Configuration file " & CONFIG_FILE & " is not in the " & ApplicationName$() & " directory!"
      Goto Done
   End If

   'Create an xml document
   Dim xmlDoc as MIXmlDocumentxmlDoc = MIXmlDocumentCreate()
   Dim parseErr, valid, resext as SmallInt

   Dim i as SmallInt
   Dim sXmlDocPath as String
   sXmlDocPath = ApplicationDirectory$() & CONFIG_FILE
   Print "Attempting to load - " & sXmlDocPath
   'Load config into xmlDoc

   i = MIXmlDocumentLoad(xmlDoc, sXmlDocPath, parseErr, valid, resext)
   Print "parseErr " & parseErr
   'Check load errors

   If parseErr > 0 then
      Note "Could not load " & ApplicationDirectory$() & CONFIG_FILE & Chr$(13) &
      "This could be because the file contains invalid XML" & Chr$(13) &
      "Please check " & CONFIG_FILE & " is valid and try again!"
      Goto Done
   End If

   Print "Successfully Loaded - " & sXmlDocPath

   'Select root node <Config>

   Dim xmlRootNode as MIXmlNodexmlRootNode =   MIXmlDocumentGetRootNode(xmlDoc)
   Print "Loading Menu Settings....."


   'XPath query to select menu config
   Dim strXPath as String
   strXPath = "/Config/Menus/Menu"

   Dim xmlMenusList as MIXmlNodeList
   xmlMenusList = MIXmlSelectNodes(xmlRootNode,strXPath)

   'Select fist menu node

   Dim xml_node as MIXmlNode
   xml_node = MIXmlGetNextNode(xmlMenusList)

   Dim strValue as String

   strValue = String$(500," ")
   Dim nLen As Integer

   nLen = 500
   'Get attribute value from Name attribute

   i = MIXmlNodeGetAttributeValue(xml_node, "Name", strValue, nLen)Mnu.MenuName = strValue
   Print "Menu Name - " & Mnu.MenuName

   Dim xmlMenuItemsList as MIXmlNodeList
   xmlMenuItemsList = MIXmlGetChildList(xml_node)
   xml_node = MIXmlGetNextNode(xmlMenuItemsList)

   Dim iMenuItemCount as Integer

   iMenuItemCount = 1
   Do While xml_node > 0
   'Get element/node value for iMenuItemCount menu item

      Redim Mnu.MenuItemName(iMenuItemCount)i = MIXmlNodeGetValue(xml_node, strValue, nLen)
      Mnu.MenuItemName(iMenuItemCount) = strValue

      'Get CallingSub attribute value for iMenuItemCount menu item

      Redim Mnu.MenuItemCallingSub(iMenuItemCount) i = MIXmlNodeGetAttributeValue(xml_node, "CallingSub", strValue, nLen)
      Mnu.MenuItemCallingSub(iMenuItemCount) = strValue

      Print "Menu Item " & iMenuItemCount & " - " & Mnu.MenuItemName(iMenuItemCount) & " Calling " & Mnu.MenuItemCallingSub(iMenuItemCount)

      'Get next note in the collection list

      xml_node = MIXmlGetNextNode(xmlMenuItemsList)
      iMenuItemCount = iMenuItemCount + 1
   Loop

   Print " "
   LoadConfig = true
Done:
   Exit Function

CatchEx:
   Note Error$()
   Resume Done
End Function
'-------------------------------------------------------------------
Sub ShowMenu
OnError Goto CatchEx

   Dim strCommand as String
   Dim i as Integer

   'Here I build a command string with values from the xml configuration

   strCommand = "Create Menu " & Chr$(34) & Mnu.MenuName & Chr$(34) & " As "

   For i = 1 to Ubound(Mnu.MenuItemName())
      If Mnu.MenuItemName(i) = "(-" Then

         'Create menu spacer line
         strCommand = strCommand & Chr$(34) & "(-" & Chr$(34)
      Else

         'Create Menu Item from configuration
         strCommand = strCommand & Chr$(34) & Mnu.MenuItemName(i) & Chr$(34) & " Calling " & Mnu.MenuItemCallingSub(i)
      End If

      If i + 1 <= Ubound( Mnu.MenuItemName()) Then
         'This just add the required comma unless it is the last item
         strCommand = strCommand & ", "
      End If
   Next


Print strCommand ' for debug
Run Command strCommand

Alter Menu Bar Add Mnu.MenuName

Done:
   Exit Sub
CatchEx:
   Note Error$()
   Resume Done

End Sub
'-------------------------------------------------------------------
Sub AdminUser
   Note "Hello Admin Configured User"
End Sub
'-------------------------------------------------------------------
Sub GeneralUser
   Note "Hello General Configured User"
End Sub
'-------------------------------------------------------------------
Sub AboutExample
   Note "XML Example with Dynamic Menus"
End Sub
'-------------------------------------------------------------------
Sub ExitExample
   End Program
End Sub


Here is the xml file that is used for configuration. If you want to remove a menu item eg: admin then just delete the menuitem line in the xml. Note: I did try to comment out using <!-- --> but the mapbasic xml implementation still read it?

<?xml version="1.0" encoding="utf-8"?>
<Config>
   <Menus>
      <Menu Name="XML Example">
         <MenuItem CallingSub="AdminUser">Hello - Admin</MenuItem>
         <MenuItem CallingSub="GeneralUser">Hello - General</MenuItem>
         <MenuItem CallingSub="">(-</MenuItem>
         <MenuItem CallingSub="AboutExample">About</MenuItem>
         <MenuItem CallingSub="">(-</MenuItem>
         <MenuItem CallingSub="ExitExample">Exit</MenuItem>
      </Menu>
   </Menus>
</Config>