"let s:ElementRegex = '\s*\(.*\)<\(\w\+\)\%(\s\+\(\w\+\)="\(.\{-}\)"\)*>\([^<]\{-}\)\(.*\)\s*' let s:TagRegex = '\s*<\(\w\+\)\%(\s\+\(\w\+\)="\(.\{-}\)"\)*>\(.\{-}\)\(.*\)\s*' " --------------------- " Parse XML-Tag in Text " Return a dictionary " --------------------- function! XmlGetTags(Text) let Text = a:Text let Elements = [] " get all elements while Text != '' let TagName = substitute(Text, s:TagRegex, '\1', '') if ((TagName != '') && (TagName != Text)) " found outer tag let Tag = {} let Tag['Name'] = TagName let Tag['Attributes'] = {} let TagAttributeName = substitute(Text, s:TagRegex, '\2', '') if TagAttributeName != '' let Tag['Attributes']['Name'] = TagAttributeName let TagAttributeValue = substitute(Text, s:TagRegex, '\3', '') let Tag['Attributes']['Value'] = TagAttributeValue endif " check for inner tags let subText = substitute(Text, s:TagRegex, '\4', '') let Tag['Elements'] = XmlGetTags(subText) let Elements += [Tag] let Text = substitute(Text, s:TagRegex, '\5', '') elseif match(Text, '\s*[^<>]*\s*') >= 0 " only text let Elements += [substitute(Text, '\s*\(.\{-}\)\s*', '\1', '')] let Text = '' else " Error in parser echo 'No Tag' Text return [] endif endwhile return Elements endfunction let s:OpenTagRegex = '<\(\w\+\)' let s:CloseTagRegex = '