Click here to Skip to main content
15,894,646 members
Please Sign up or sign in to vote.
4.00/5 (1 vote)
See more:
The following code loads XML nodes names and attributes name into my treeveiw control. I describe the problems towards the button.
VB
For Each Record As XElement In doc...<record>
          recordNode = TreeView1.Nodes.Add(Record.Name.ToString)
          For Each Leader As XElement In Record...<leader>
              leaderNode = recordNode.Nodes.Add(Leader.Name.ToString)
                  For Each Controlfield As XElement In Record...<controlfield>
                      controlfieldNode = recordNode.Nodes.Add(Controlfield.@tag.ToString)
                  For Each Datafield As XElement In Record...<datafield>
                      datafielNode = recordNode.Nodes.Add(Datafield.@tag.ToString)
                  Next
              Next
          Next
      Next

XML code:
XML
<collection>
<record>
  <leader>03439cam  2200481Ia 4500</leader>
 <controlfield tag="001">648147285</controlfield>
  <controlfield tag="003">SIRSI</controlfield>
  <controlfield tag="005">20110301135853.0</controlfield>
  <controlfield tag="008">100716s2010    cauab    bm  f000 0 eng d</controlfield>
  <controlfield tag="007">cr b|||||a||||</controlfield>  
  <datafield tag="035" ind1=" " ind2=" ">
    <subfield code="a">TEST</subfield>
  </datafield>
  <datafield tag="037" ind1=" " ind2=" ">
    <subfield code="a">ADA524635</subfield>
    <subfield code="b">DTI</subfield>
  </datafield>
  <datafield tag="043" ind1=" " ind2=" ">
    <subfield code="a">n-us---</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
    <subfield code="a">AD#</subfield>
    <subfield code="c">AD#</subfield>
    <subfield code="d">3D#</subfield>
  </datafield>  
  <datafield tag="049" ind1=" " ind2=" ">
    <subfield code="a">AD#A</subfield>
  </datafield>
   <datafield tag="090" ind1=" " ind2=" ">
    <subfield code="a">:</subfield>
	</datafield>
  <datafield tag="100" ind1="1" ind2=" ">
    <subfield code="a"></subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="0">
    <subfield code="a"></subfield>    
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
    <subfield code="a">:</subfield>	
    <subfield code="b"></subfield>
    <subfield code="c">2010.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
    <subfield code="a">xxiv, 87 p. :</subfield>
    <subfield code="b">col. ill., col. maps ;</subfield>
    <subfield code="c">28 cm.</subfield>
  </datafield>
  <datafield tag="500" ind1="a" ind2=" ">
    <subfield code="a">Thesis Advisor(s): </subfield>
  </datafield>
  <datafield tag="500" ind1="b" ind2=" ">
    <subfield code="a">"June 2010."</subfield>
  </datafield>
  <datafield tag="500" ind1="c" ind2=" ">
    <subfield code="a">Author(s) </subfield>
	</datafield>  
  <datafield tag="500" ind1=" " ind2=" ">
    <subfield code="a">Description based on title screen as viewed on July 14, 2010.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
    <subfield code="a"></subfield></datafield>
  <datafield tag="502" ind1=" " ind2=" ">
    <subfield code="a">Thesis </subfield>
  </datafield>
  <datafield tag="504" ind1=" " ind2=" ">
    <subfield code="a">Includes bibliographical references (p. 85-86).</subfield>
  </datafield>
  <datafield tag="506" ind1=" " ind2=" ">
    <subfield code="a">"Approved for public release, distribution unlimited"--Cover.</subfield>
  </datafield>
  <datafield tag="520" ind1=" " ind2=" ">
    <subfield code="a">t co</subfield></datafield>
  <datafield tag="530" ind1=" " ind2=" ">
    <subfield code="a">Also available in print.</subfield>
  </datafield>
  <datafield tag="538" ind1=" " ind2=" ">
    <subfield code="a">Mode of access: World Wide Web.</subfield>
  </datafield>
  </record>


Example of output notice that I get only one controlfield node but I get all the datafieldnodes:
Leader
 	001
	035
	040
	037
	CONTINUES DOWN 

The following code loads all my datafield nodes with no problems.
Output
035
.
.
538
VB
For Each Datafield As XElement In Record...<datafield>
                        datafielNode = recordNode.Nodes.Add(Datafield.@tag.ToString)

The problem:
The following code which it should be similar to the previous only loads one control field node (the first one). If you see the XML sample I got 5 controlfield nodes.

Output:
001
VB
For Each Controlfield As XElement In Record...<controlfield>
    controlfieldNode = recordNode.Nodes.Add(Controlfield.@tag.ToString)

Appreciate your help.
Posted
Updated 12-May-11 18:24pm
v2

1 solution

According to your xml, Controlfield and Datafield are not child nodes of the Leaderfield.

You should run three independant for loops for each of them, instead of nesting them.
 
Share this answer
 
Comments
stopete82 13-May-11 10:52am    
Your totally right; thanks for the advice. This worked for me:

This code gave me the leader and the controlfields nodes:

For Each Record As XElement In doc...<record>

recordNode = TreeView1.Nodes.Add(Record.Name.ToString)


For Each Leader As XElement In Record...<leader>

leaderNode = recordNode.Nodes.Add(Leader.Name.ToString)



For Each Controlfield As XElement In Record...<controlfield>
controlfieldNode = recordNode.Nodes.Add(Controlfield.@tag.ToString)

Next

Next

Next

This code gave me the datafield nodes:

For Each Record As XElement In doc...<record>

recordNode = TreeView1.TopNode
For Each Datafield As XElement In Record...<datafield>
datafielNode = recordNode.Nodes.Add(Datafield.@tag.ToString)

For Each Subfield As XElement In Datafield...<subfield>
datafielNode.Nodes.Add(Subfield.@code.ToString)

Next
Next
Next

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900