monkeybiz12345
asked on
XML - how to check for the existence of an element and retrieve its value if found
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!
My XML file looks like this:
<JobInfo>
<JobHeader>
<Job>00006962</Job>
<Value> 205.88</Value>
</JobHeader>
<MaterialPosting>
<StockCode>COMPONENT1</Sto ckCode>
<QtyIssued>2</QtyIssued>
<Bins>
<Bin>Assembly1</Bin>
<BinQtyIssued>2</BinQtyIss ued>
</Bins>
</MaterialPosting>
<MaterialPosting>
<StockCode>COMPONENT2</Sto ckCode>
<QtyIssued>1</QtyIssued>
<Lot>LOT6000</Lot>
<Bins>
<Bin>Assembly1</Bin>
<BinQtyIssued>1</BinQtyIss ued>
</Bins>
<Serials>
<Serial>1962919011</Serial >
<SerialQtyIssued>1</Serial QtyIssued>
<ExpirationDate/>
</Serials>
</MaterialPosting>
</JobInfo>
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
My XML file looks like this:
<JobInfo>
<JobHeader>
<Job>00006962</Job>
<Value> 205.88</Value>
</JobHeader>
<MaterialPosting>
<StockCode>COMPONENT1</Sto
<QtyIssued>2</QtyIssued>
<Bins>
<Bin>Assembly1</Bin>
<BinQtyIssued>2</BinQtyIss
</Bins>
</MaterialPosting>
<MaterialPosting>
<StockCode>COMPONENT2</Sto
<QtyIssued>1</QtyIssued>
<Lot>LOT6000</Lot>
<Bins>
<Bin>Assembly1</Bin>
<BinQtyIssued>1</BinQtyIss
</Bins>
<Serials>
<Serial>1962919011</Serial
<SerialQtyIssued>1</Serial
<ExpirationDate/>
</Serials>
</MaterialPosting>
</JobInfo>
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
You are welcome!
ASKER