XML - how to check for the existence of an element and retrieve its value if found

monkeybiz12345
monkeybiz12345 used Ask the Experts™
on
Greetings Experts!

Working with vbscript and a very limited knowledge of XML files, I'm trying to create a function that gets several pieces of information from the MaterialPosting element of an XML file.  

As long as I stick to elements that 1) are always present in the XML and 2) have values directly under the /JobInfo/MaterialPosting element, such as StockCode, I can get what I need but I'm having trouble retrieving the values of items that are one level deeper, such as Bins and Serials.  I was able to figure out how to get the value of the Bins/Bin element (see line 21 of the code below). However, it doesn't work for serials because the Serials element does not always exist.  

After spending the better part of a day with the Microsoft docs on XML Dom, my head is spinning and I still don't get it.  The code below is my latest attempt.  It returns an error of "object doesn't support this property or method" at line 11.  

How can I check to see if the element called Serials exists in my XML and, if the Serial element exists, retrieve its value?

Many thanks, in advance, for your help!



Dim objDom, objNodeList, Counter, myXML
   Set objDom = CreateObject("MSXML2.DOMDocument")
   objDom.LoadXML(XMLOut)

   Set objNodeList = objDom.SelectNodes ("//JobInfo/MaterialPosting")
       If objNodeList.length > 0 then

  ' Loop through each of the MaterialPosting elements
      For Counter = 0 To objNodeList.length - 1
          dim aSerialNode
          aSerialNode = objNodeList(Counter).SelectSingleNode("//JobInfo/MaterialPosting/Serials")
		  If aSerialNode = nothing Then
		     msgbox "no serial node"
		  Else
		     msgbox "serial node found"
		  End If
 
         MyXML = MyXML & objNodeList(Counter).SelectSingleNode("MStockCode").Text & Chr(255) &_
                 objNodeList(Counter).SelectSingleNode("MLot").Text & Chr(255) &_
	         objNodeList(Counter).SelectSingleNode("MQtyIssued").Text & Chr(255) &_
	   	 objNodeList(Counter).SelectSingleNode("./MBins/Bin").Text & vbCrLf
		   ' objNodeList(Counter).SelectSingleNode("./MSerials/Serial").Text & vbCrLf
         
      Next
   End If 

Open in new window



My XML file looks like this:

<JobInfo>
   <JobHeader>
      <Job>00006962</Job>
      <Value>          205.88</Value>
   </JobHeader>
<MaterialPosting>
   <StockCode>COMPONENT1</StockCode>
   <QtyIssued>2</QtyIssued>
   <Bins>
      <Bin>Assembly1</Bin>
      <BinQtyIssued>2</BinQtyIssued>
   </Bins>
</MaterialPosting>
<MaterialPosting>
<StockCode>COMPONENT2</StockCode>
<QtyIssued>1</QtyIssued>
<Lot>LOT6000</Lot>
<Bins>
   <Bin>Assembly1</Bin>
   <BinQtyIssued>1</BinQtyIssued>
</Bins>
<Serials>
   <Serial>1962919011</Serial>
   <SerialQtyIssued>1</SerialQtyIssued>
   <ExpirationDate/>
</Serials>
</MaterialPosting>
</JobInfo>
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
something like :
dim serial_node
set serial_node = objNodeList(Counter).SelectSingleNode("./MSerials/Serial")
if not serial_node is Nothing then MyXML = MyXML & serial_node.Text

Open in new window

Author

Commented:
This gets me going again.  Thank you zc2!
You are welcome!

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial