Using XPath to test if XML node exists

Using ASP, I'm trying to access specific XML nodes with .SelectSingleNode("//TAGNAME") and test if the tag exists. Accessing the nodes (when they exist) is no problem, but the test for existance has me stumped.
I tried:
set thisNode = xmlDoc.documentElement.SelectSingleNode("//TAGNAME")
      If StrComp("thisNode.Text", "" )<> 0 Then
            Response.Write thisNode.Text
      End If
but it gives me an 'object required' error

Should I use getElementsByTagName() instead?

I'm sure this is not a very difficult question for you experts, but I'm stuck on this and a quick solution is very important, so I'm assigning more points.
Thanks
EzogAsked:
Who is Participating?
 
davidlars99Commented:
so you got it working..?
0
 
davidlars99Commented:
do not use "set" (and maybe """ around thisNode.Text)
0
 
davidlars99Commented:
and make sure you have

> Dim xmlDoc   As New XML.XMLDocument

before you do anything
0
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
davidlars99Commented:
or
> Set xmlDoc=Server.CreateObject("microsoft.xmldom")
0
 
davidlars99Commented:
if none of these help try

> thisNode = xmlDoc.documentElement.SelectSingleNode("//TAGNAME").Text

that's all I could think of.. :)
0
 
EzogAuthor Commented:
I have:
set xmlDocL = CreateObject("Microsoft.XMLDom")
xmlDoc.async = False
Set xmlDoc = objXMLHTTP.responseXML

If I use
thisNode = xmlDoc.documentElement.SelectSingleNode("//TAGNAME").Text

I still get the 'object reqiured' error
0
 
EzogAuthor Commented:
when I tried:

set objElements = xmlDoc.getElementsByTagName("TAGNAME")
        If objElements.Item(0) Is Nothing Then
              thisNode = ""           
        Else
             thisNode = objElements.Item(0).nodeTypeString
        End If
Response.Write thisNode

I get 'element' as response instead of the string value
0
 
davidlars99Commented:
what line is that you getting error on..?
0
 
davidlars99Commented:
> set xmlDocL = CreateObject("Microsoft.XMLDom")
 what's  xmlDoc-"L " shouldn't it be  xmlDoc
0
 
EzogAuthor Commented:
the "L" - just a typo,

I get the error on the Response.Write line
0
 
EzogAuthor Commented:
I also tried:

set thisNode = xmlDoc.documentElement.SelectSingleNode("//TAGNAME")
If len (thisNode.Text) >0 Then
       Response.Write thisNode.Text
End If

I get an error only when the tag does not exist.
0
 
davidlars99Commented:
try
> Set xmlDoc = CreateObject("Msxml2.DOMDocument")

and something very important

> Set xmlDoc = objXMLHTTP.responseXML
after this xmlDoc is not an object anymore...



I think that correct way would be following...


Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.load(path_to_the_same_file_which_is_loaded_into_objXMLHTTP)

set thisNode = xmlDoc.documentElement.SelectSingleNode("//TAGNAME")
If len (thisNode.Text) >0 Then
       Response.Write thisNode.Text
End If





0
 
davidlars99Commented:
when you try "thisNode.Text" it's looking for the object, but with "Set xmlDoc = objXMLHTTP.responseXML"    "xmlDoc"  would never be the object
0
 
EzogAuthor Commented:
I inserted
    Set xmlDoc = CreateObject("Msxml2.DOMDocument")
and replaced
    Set xmlDoc = objXMLHTTP.responseXML
with
    xmlDoc.load("http://URL")
path_to_the_same_file_which_is_loaded_into_objXMLHTTP

but get:
Microsoft VBScript runtime error '800a01a8'
Object required
/response.asp, line 49
which is:
    set thisNode = xmlDoc.documentElement.SelectSingleNode("//TAGNAME")

Also, I only received an error if the tag is missing.  If the tag exists, I can enter its value into the form with the following:
     Set rootNode = xmlDoc.documentElement
     Set thisNode = rootNode.SelectSingleNode("//TAGNAME")
      Response.Write thisNode.Text
0
 
davidlars99Commented:
how about


Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.load(path_to_the_same_file_which_is_loaded_into_objXMLHTTP)
set xmlResponse=xmlDoc.responseXML  'also try without "set"

thisNode = xmlResponse.documentElement.SelectSingleNode("//TAGNAME")
If len (thisNode.Text) >0 Then
       Response.Write thisNode.Text
End If



0
 
davidlars99Commented:
ok, ignore my last post and try this first


Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.load(path_to_the_same_file_which_is_loaded_into_objXMLHTTP)

thisNode = xmlDoc.documentElement.SelectSingleNode("//TAGNAME")
If len (thisNode.Text) >0 Then
       Response.Write thisNode.Text
End If



is loading file XML or some other type..?
0
 
EzogAuthor Commented:
I get with and without "set":
'Microsoft VBScript runtime error '800a01b6'
Object doesn't support this property or method: 'responseXML'
/response.asp, line 27
0
 
davidlars99Commented:
did you try one above your post..?
0
 
EzogAuthor Commented:
I'm getting a feed with about 30 possible tags but only about half of them are returned at any given time.  I don't want to use stylesheets so I try to find the missing tags with conditionals...
maybe I'm going about it the wrong way
0
 
EzogAuthor Commented:
hm, I don't understand that comment.  What do you mean with "above your post"?
0
 
davidlars99Commented:
I mean this one


Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.load(path_to_the_same_file_which_is_loaded_into_objXMLHTTP)

thisNode = xmlDoc.documentElement.SelectSingleNode("//TAGNAME")
If len (thisNode.Text) >0 Then
       Response.Write thisNode.Text
End If
0
 
EzogAuthor Commented:
I think I might have figured it out:
This one works with the old
    Set xmlDoc = objXMLHTTP.responseXML

set objElements = objXML.selectSingleNode("//ZONING")
        if objElements is nothing then
        Response.Write "(Not available)"
    else
        Response.Write objElements.Text
    end if
0
 
EzogAuthor Commented:
actualy, I rewrote the thing and used objXML instead of xmlDOC (just for reference or the code would not make sence!)
0
 
EzogAuthor Commented:
I think it works... at least so far, but I would like to leave the treat open until I have done some more testing. Thank you so much for you help! I will award your points on closing.
0
 
gnudiffCommented:
> Using XPath to test if XML node exists

Is there any reason for not using simply SelectSingleNode("count(//TAGNAME)") Xpath? It should return the count of TAGNAME nodes, 0 - if no such nodes exist...

0
 
EzogAuthor Commented:
I tried the SelectSingleNode("count(//TAGNAME)") and got the following error:

    msxml3.dll error '80004005'
    Unknown method. -->count(//<--STATE)

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.