XML / XPath Query Examples

By Robbe D. Morris

Printer Friendly Version


Robbe & Melisa Morris
Here are a few little XPath snippets of how to query for a specific node or node list in an XML document looking for specific attribute values.


Sample Code
  
sXML string equals the following 

<?xml version='1.0'?> 
  <EXAMPLE> 
      <CUSTOMER id="1" type="B">Mr.  Jones</CUSTOMER> 
      <CUSTOMER id="2" type="C">Mr.  Johnson</CUSTOMER> 
  </EXAMPLE> 

<% 

  Dim oXMLDoc 
  Dim oXMLNode 
  Dim oXMLNodeList 

   Set oXMLDoc =  Server.CreateObject("MSXML2.DOMDocument.4.0") 

          oXMLDoc.LoadXML(sXML) 

  Set oXMLNode = oXMLDoc.selectSingleNode("//EXAMPLE/CUSTOMER[@id='2' or @type='C']") 

         ' oXMLNode.Text will show "Mr Johnson" 

  Set oXMLNode = oXMLDoc.selectSingleNode("//EXAMPLE/CUSTOMER[@id='1' and @type='B']") 

         ' oXMLNode.Text will show "Mr Jones" 
         ' oXMLNode.Attributes.getNamedItem("id").Text will show "1" 
         ' oXMLNode.Attributes.getNamedItem("type").Text will show "B" 
       
  ' Select a node list where id equals 1 and the type equals B or C.   
  ' In our example, only Mr.  Jones will be returned. 

   Set oXMLNodeList = oXMLDoc.selectNodes("//EXAMPLE/CUSTOMER[@id='1' and (@type='B' or @type='C')]") 

     ' oXMLNode.Text will show "Mr Jones" 

  ' Select a node with a specific text value 

   Set oXMLNode = oXMLDoc.selectSingleNode("//EXAMPLE/CUSTOMER[.  ='Mr.  Johnson']") 

         ' oXMLNode.Text will show "Mr.  Johnson" 

  ' Select node list of all nodes with CUSTOMER not equal to "EggHeadCafe" 

   oXMLNodeList.selectNodes("//EXAMPLE/CUSTOMER[.  !='EggHeadCafe']")       



'  Start of MSXML4 or higher features.   If you want to use MSXML3, then 
'  you'll need to set the following:   

    oXMLDoc.setProperty "SelectionLanguage", "XPath" 


' Search for a substring in an attribute 

Set oXMLNode = oXMLDoc.selectSingleNode("//EXAMPLE/CUSTOMER[substring(@type,1,2) ='DE']")       

' Search for a substring in a node value 

Set oXMLNode = oXMLDoc.selectSingleNode("//EXAMPLE/CUSTOMER[substring(.,1,3) ='Mr.']")     

' Search for a value contained in an attribute 

Set oXMLNode = oXMLDoc.selectSingleNode("//EXAMPLE/CUSTOMER[contains(@type,'DECEA')]")       

' Search for a contained in a node value 

Set oXMLNode =  oXMLDoc.selectSingleNode("//EXAMPLE/CUSTOMER[contains(.,'Smith')]")     

' Search only from root of selected node.   This examples gets a list of nodes 
' from a specific node not the whole XML document.   This XML document 
' is too small to be a reasonable example but you get the idea.   
' The ".//" tells the parser to make the current node the "root" node of the 
' document for this specific XPath query.   Without the ".", the XPath query 
' would return all CUSTOMER nodes in the entire document even though 
' they may be above or below the current node. 

  Set oNode = oXMLDoc.selectSingleNode("//EXAMPLE") 

  Set oXMLTreeList = oNode.selectNodes(".//CUSTOMER")         

         nTot = oXMLTreeList.length - 1 
                 
         For nCnt = 0 to nTot 
                           
                Set oXMLNode = oXMLTreeList.nextNode() 
                msgbox  oXMLNode.Attributes.getNamedItem("id").Text   
       
        Next 



'  End of MSXML4 or higher features     
         

Set oXMLNode = nothing 
Set oXMLDoc = nothing 

%> 

Robbe has been a Microsoft MVP in C# since 2004.  He is also the co-founder of EggHeadCafe which provides .NET articles, book reviews, software reviews, and software download and purchase advice.