Click here to Skip to main content
15,891,372 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
What I am trying to accomplish is to get elementat(0) and elementat(1) values from datfield tag = 245. The following code works, however some records datafield tag=245 doesn have an elementat(1) so I get an error. How can I said if datafield.element.elementat(1) is nothing then data2 = “ “. Appreciate your help.

VB
Dim xd As XDocument = XDocument.Load("C:\Users\stopete\Desktop\Marc_All_856.xml")
        Dim Title245 = (From datafields In xd.Descendants("record")
                       Select datafields)

        For Each ser As XElement In Title245

            Dim data = (From datafield In ser.Descendants("datafield") Where (datafield.Attribute("tag").Value = "245")
                        Select datafield.Elements.ElementAt(0)) 
            Dim data2 = (From datafield In ser.Descendants("datafield") Where (datafield.Attribute("tag").Value = "245")
                        Select datafield.Elements.ElementAt(1))


            MsgBox(data.Value & data2.Value)

        Next


And the XML:

XML
<?xml version="1.0"?>
<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="040" ind1=" " ind2=" ">
    <subfield code="a">AD#</subfield>
    <subfield code="c">AD#</subfield>
    <subfield code="d">3D#</subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
    <subfield code="a"></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="049" ind1=" " ind2=" ">
    <subfield code="a">AD#A</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
    <subfield code="a"></subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="0">
    <subfield code="a">Supporting Marine Corps Enhanced Company Operations</subfield>
  </datafield>
</record>
<record>
  <leader>03561cam  2200445Ia 4500</leader>
  <controlfield tag="001">648166814</controlfield>
  <controlfield tag="003">SIRSI</controlfield>
  <controlfield tag="005">20110301134449.0</controlfield>
  <controlfield tag="008">100716s2010    caua     bm  f000 0 eng d</controlfield>
  <controlfield tag="007">cr b|||||a||||</controlfield>
  <datafield tag="040" ind1=" " ind2=" ">
    <subfield code="a">AD#</subfield>
    <subfield code="c">AD#</subfield>
    <subfield code="d">AD#</subfield>
  </datafield>
  <datafield tag="037" ind1=" " ind2=" ">
    <subfield code="a">ADA524549</subfield>
    <subfield code="b">DTI</subfield>
  </datafield>
  <datafield tag="043" ind1=" " ind2=" ">
    <subfield code="a">n-us---</subfield>
  </datafield>
  <datafield tag="049" ind1=" " ind2=" ">
    <subfield code="a">AD#A</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
    <subfield code="a"></subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="0">
    <subfield code="a">Determination of shock properties of ceramic corbit 98</subfield>
      </datafield>
  </record>
<record>
  <leader>04735cam  2200517Ia 4500</leader>
  <controlfield tag="001">648171956serg</controlfield>
  <controlfield tag="003">SIRSI</controlfield>
  <controlfield tag="005">20110301133804.0</controlfield>
  <controlfield tag="008">100716s2010    cauab    bm  f000 0 eng d</controlfield>
  <controlfield tag="007">cr b|||||a||||</controlfield>
  <datafield tag="040" ind1=" " ind2=" ">
    <subfield code="a">AD#</subfield>
    <subfield code="c">AD#</subfield>
    <subfield code="d">AD#</subfield>
  </datafield>
  <datafield tag="037" ind1=" " ind2=" ">
    <subfield code="a">ADA524538</subfield>
    <subfield code="b">DTI</subfield>
  </datafield>
  <datafield tag="043" ind1=" " ind2=" ">
    <subfield code="a">n-us---</subfield>
  </datafield>
  <datafield tag="049" ind1=" " ind2=" ">
    <subfield code="a">AD#A</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
    <subfield code="a">.</subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="0">
    <subfield code="a">Control over the Nile</subfield>
    <subfield code="h">[electronic resource] :</subfield>
    <subfield code="b">implications across nations /</subfield>
    <subfield code="c">David K. Chesire.</subfield>
  </datafield>
</record>
</collection

>
Posted
Updated 20-Apr-11 5:41am
v2

Try this:

VB
Dim data2 = (From datafield In ser.Descendants("datafield") 
             Where (datafield.Attribute("tag").Value = "245" And datafield.Elements.Count >= 2)
             Select datafield.Elements.ElementAt(1))
 
Share this answer
 
Comments
stopete82 20-Apr-11 11:52am    
It's works, thanks for your help.
#realJSOP 20-Apr-11 14:07pm    
Why did you mark it and then unmark it as the answer then?
stopete82 20-Apr-11 15:02pm    
Sorry I am new to this forum, I thought I needed to click on the green "Accept Solution" label.
Check Count() first before using ElementAt().
 
Share this answer
 
v2
Comments
#realJSOP 20-Apr-11 11:46am    
HA! Beat you to it. :)
Nish Nishant 20-Apr-11 11:49am    
Touche!

Seems SA is taking his once a week nap. Else he'd have beat all of us to this.
stopete82 20-Apr-11 11:52am    
Count() is does the trick, thanks for all your help.
Nish Nishant 20-Apr-11 12:03pm    
You are welcome. Glad it helped.

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