Rick Johnson
Rick Johnson

Reputation: 89

Parsing a poorly constructed XML file in VB.NET

I refer to the XML file as poorly constructed due to the fact that everything I want to get to is all stored across several elements which are all named "data" instead of having appropriately named elements. This XML is returned from an API call of a program I'm integrating with (GoldMine CRM), so I can not influence how this XML would be constructed.

Here is the XML:

<GMAPI call="GetActiveWindowsList">
  <status code="1">Success</status>
  <data name="WindowsList">
    <data name="window">
      <data name="hWnd">2952796</data>
      <data name="WindowName">DIALOGSCHEDULEDEFAULT</data>
      <data name="WindowInternalName">DIALOG: 7220</data>
      <data name="Caption">Schedule a Next Action</data>
      <data name="WindowRect">
        <data name="Left">1032</data>
        <data name="Right">1550</data>
        <data name="Bottom">727</data>
        <data name="Top">177</data>
      </data>
      <data name="ClientRect">
        <data name="Left">1035</data>
        <data name="Right">1547</data>
        <data name="Bottom">724</data>
        <data name="Top">202</data>
      </data>
      <data name="Controls">
        <data name="#32770">
          <data name="Enabled">1</data>
          <data name="Visible">1</data>
          <data name="ParentID">2952796</data>
          <data name="hWnd">5574210</data>
          <data name="ID">0</data>
          <data name="Text">Detail</data>
          <data name="Controls">
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3083840</data>
              <data name="ID">-1</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3345982</data>
              <data name="ID">1022</data>
              <data name="Text">Lin&amp;k to selected Contact:</data>
            </data>
            <data name="Edit">
              <data name="Enabled">0</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3411510</data>
              <data name="ID">104</data>
              <data name="Text">Bea Defkow</data>
            </data>
            <data name="Button">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">4460084</data>
              <data name="ID">1047</data>
            </data>
            <data name="Button">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3149362</data>
              <data name="ID">52325</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">2952750</data>
              <data name="ID">-1</data>
              <data name="Text">&amp;Reference:</data>
            </data>
            <data name="F2Edit">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">4001322</data>
              <data name="ID">1016</data>
              <data name="Text">CR</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">4457274</data>
              <data name="ID">99</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">4197926</data>
              <data name="ID">-1</data>
              <data name="Text">&amp;Notes:</data>
            </data>
            <data name="GM_CAL_HTML_EDIT_CTRL">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">5246490</data>
              <data name="ID">1017</data>
              <data name="Text">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;
&lt;HTML&gt;&lt;HEAD&gt;
&lt;STYLE type=text/css&gt; P, UL, OL, DL, DIR, MENU, PRE { margin: 0 auto;}&lt;/STYLE&gt;

&lt;META name=GENERATOR content="MSHTML 11.00.9600.17041"&gt;&lt;/HEAD&gt;&lt;BODY leftMargin=1 rightMargin=1 topMargin=1&gt;&lt;FONT size=2 face="Segoe UI"&gt;&lt;DIV&gt;CN&lt;/DIV&gt;&lt;/FONT&gt;&lt;/BODY&gt;&lt;/HTML&gt;</data>
              <data name="Controls">
                <data name="ToolbarWindow32">
                  <data name="Enabled">1</data>
                  <data name="Visible">1</data>
                  <data name="ParentID">5246490</data>
                  <data name="hWnd">4066838</data>
                  <data name="ID">1002</data>
                </data>
                <data name="ATL:01A98E08">
                  <data name="Enabled">1</data>
                  <data name="Visible">1</data>
                  <data name="ParentID">5246490</data>
                  <data name="hWnd">3214868</data>
                  <data name="ID">1001</data>
                  <data name="Controls">
                    <data name="Shell Embedding">
                      <data name="Enabled">1</data>
                      <data name="Visible">1</data>
                      <data name="ParentID">3214868</data>
                      <data name="hWnd">3018258</data>
                      <data name="ID">0</data>
                      <data name="Controls">
                        <data name="Shell DocObject View">
                          <data name="Enabled">1</data>
                          <data name="Visible">1</data>
                          <data name="ParentID">3018258</data>
                          <data name="hWnd">3018254</data>
                          <data name="ID">0</data>
                          <data name="Controls">
                            <data name="Internet Explorer_Server">
                              <data name="Enabled">1</data>
                              <data name="Visible">1</data>
                              <data name="ParentID">3018254</data>
                              <data name="hWnd">3018252</data>
                              <data name="ID">0</data>
                            </data>
                          </data>
                        </data>
                      </data>
                    </data>
                  </data>
                </data>
              </data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3018250</data>
              <data name="ID">-1</data>
              <data name="Text"> Options </data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3018232</data>
              <data name="ID">-1</data>
              <data name="Text">Acti&amp;vity:</data>
            </data>
            <data name="ComboBox">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3280372</data>
              <data name="ID">1039</data>
              <data name="Text">Next Actn</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3280368</data>
              <data name="ID">-1</data>
              <data name="Text">Cod&amp;e:</data>
            </data>
            <data name="F2Edit">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">5246436</data>
              <data name="ID">1012</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">454363506</data>
              <data name="ID">99</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3411422</data>
              <data name="ID">-1</data>
              <data name="Text">C&amp;olor:</data>
            </data>
            <data name="ComboBox">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3411394</data>
              <data name="ID">1037</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3411314</data>
              <data name="ID">291</data>
              <data name="Text">Opportunity / &amp;Project:</data>
            </data>
            <data name="ComboBox">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3411312</data>
              <data name="ID">1040</data>
              <data name="Text">(none)</data>
            </data>
            <data name="Button">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3542370</data>
              <data name="ID">2010</data>
              <data name="Text">New</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">20778328</data>
              <data name="ID">292</data>
              <data name="Text">Or Case:</data>
            </data>
            <data name="ComboBox">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3476822</data>
              <data name="ID">52168</data>
              <data name="Text">(none)</data>
            </data>
            <data name="Button">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3345734</data>
              <data name="ID">2011</data>
              <data name="Text">New</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3345724</data>
              <data name="ID">-1</data>
              <data name="Text">Primary &amp;User:</data>
            </data>
            <data name="ComboBox">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3345718</data>
              <data name="ID">1011</data>
              <data name="Text">RICK ()</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3345710</data>
              <data name="ID">-1</data>
              <data name="Text"> Time </data>
            </data>
            <data name="Button">
              <data name="Enabled">1</data>
              <data name="Visible">0</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3345708</data>
              <data name="ID">2067</data>
              <data name="Text">Recurring...</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">53742874</data>
              <data name="ID">-1</data>
              <data name="Text">&amp;Date:</data>
            </data>
            <data name="DateEdit">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">4787478</data>
              <data name="ID">1013</data>
              <data name="Text">6/25/2014</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">1442624</data>
              <data name="ID">99</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">5311752</data>
              <data name="ID">101</data>
              <data name="Text">Ti&amp;me:</data>
            </data>
            <data name="TimeEdit">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">5442822</data>
              <data name="ID">1014</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">5899074</data>
              <data name="ID">99</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">42142960</data>
              <data name="ID">-1</data>
              <data name="Text">Durat&amp;ion:</data>
            </data>
            <data name="Edit">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">6032574</data>
              <data name="ID">1018</data>
              <data name="Text">0</data>
            </data>
            <data name="msctls_updown32">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">3214524</data>
              <data name="ID">-1</data>
            </data>
            <data name="ComboBox">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">5246130</data>
              <data name="ID">1036</data>
              <data name="Text">Min  </data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">8457380</data>
              <data name="ID">1023</data>
              <data name="Text">A&amp;larm:</data>
            </data>
            <data name="TimeEdit">
              <data name="Enabled">0</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">54725774</data>
              <data name="ID">1032</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">5443466</data>
              <data name="ID">-1</data>
              <data name="Text">On:</data>
            </data>
            <data name="DateEdit">
              <data name="Enabled">0</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">40765854</data>
              <data name="ID">1033</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">1508158</data>
              <data name="ID">-1</data>
              <data name="Text">Actions</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">1311400</data>
              <data name="ID">1038</data>
              <data name="Text">Noti&amp;fy via E-mail</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">6423206</data>
              <data name="ID">1024</data>
              <data name="Text">Auto-generate R&amp;SVP</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">44630312</data>
              <data name="ID">1034</data>
              <data name="Text">Mark as Priv&amp;ate</data>
            </data>
            <data name="CheckBoxButton">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">6362818</data>
              <data name="ID">1001</data>
              <data name="Text">Send a request wit&amp;h the Next Actn to:</data>
            </data>
            <data name="ComboBox">
              <data name="Enabled">0</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">35193110</data>
              <data name="ID">1009</data>
              <data name="Text">Contact(s)</data>
              <data name="Controls">
                <data name="Edit">
                  <data name="Enabled">0</data>
                  <data name="Visible">1</data>
                  <data name="ParentID">35193110</data>
                  <data name="hWnd">2621498</data>
                  <data name="ID">1001</data>
                  <data name="Text">Contact(s)</data>
                </data>
              </data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">1</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">5641780</data>
              <data name="ID">123</data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">0</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">5308448</data>
              <data name="ID">1163</data>
              <data name="Text">RICK    </data>
            </data>
            <data name="Static">
              <data name="Enabled">1</data>
              <data name="Visible">0</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">1441814</data>
              <data name="ID">1164</data>
              <data name="Text">RICK    </data>
            </data>
            <data name="ListBox">
              <data name="Enabled">0</data>
              <data name="Visible">0</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">45681014</data>
              <data name="ID">0</data>
            </data>
            <data name="ListBox">
              <data name="Enabled">0</data>
              <data name="Visible">0</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">1311540</data>
              <data name="ID">0</data>
            </data>
            <data name="ListBox">
              <data name="Enabled">0</data>
              <data name="Visible">0</data>
              <data name="ParentID">5574210</data>
              <data name="hWnd">4396658</data>
              <data name="ID">0</data>
            </data>
          </data>
        </data>
        <data name="RadioButton">
          <data name="Enabled">1</data>
          <data name="Visible">1</data>
          <data name="ParentID">2952796</data>
          <data name="hWnd">2952792</data>
          <data name="ID">1</data>
          <data name="Text">Schedule</data>
        </data>
        <data name="Button">
          <data name="Enabled">1</data>
          <data name="Visible">1</data>
          <data name="ParentID">2952796</data>
          <data name="hWnd">2952782</data>
          <data name="ID">2</data>
          <data name="Text">Cancel</data>
        </data>
        <data name="Button">
          <data name="Enabled">0</data>
          <data name="Visible">0</data>
          <data name="ParentID">2952796</data>
          <data name="hWnd">2952776</data>
          <data name="ID">12321</data>
          <data name="Text">Apply</data>
        </data>
        <data name="Button">
          <data name="Enabled">1</data>
          <data name="Visible">0</data>
          <data name="ParentID">2952796</data>
          <data name="hWnd">2952774</data>
          <data name="ID">9</data>
          <data name="Text">Help</data>
        </data>
        <data name="SysTabControl32">
          <data name="Enabled">1</data>
          <data name="Visible">1</data>
          <data name="ParentID">2952796</data>
          <data name="hWnd">2952772</data>
          <data name="ID">12320</data>
        </data>
      </data>
    </data>

I'm looking for a function that parses this and returns a few fields each, for a few nodes as follows:

  1. The ParentID and hWnd from the branch where data name ID is 1016
  2. The ParentID and hWnd from the branch where data name ID is 1017
  3. The ParentID and hWnd from the branch where data name ID is 1012
  4. The ParentID and hWnd from the branch where data name ID is 1013

I have no code to supply for this portion of my project so far because nothing was workable enough to continue working on. I've never needed to get this deep into XML programming before so some of the approaches are confusing. I'm hoping some kind souls are able to whip this out without going through the days of anguish I went through, thanks!

Upvotes: 1

Views: 116

Answers (1)

Mark
Mark

Reputation: 8160

This should do it, using LINQ to XML:

Dim myXML As String = GetXmlFromSomewhere()
Dim xml = XElement.Parse(myXML)
Dim ids = { "1012", "1013", "1016", "1017" }
Dim result = 
    From d In xml...<data>
    Where d.@name = "ID" AndAlso ids.Contains(d.Value)
    Select
        ID = d.Value,
        ParentID = (From x In d.Parent.<data> Where x.@name = "ParentID" Select x.Value).FirstOrDefault(),
        hWnd = (From x In d.Parent.<data> Where x.@name = "hWnd" Select x.Value).FirstOrDefault()

Upvotes: 3

Related Questions