[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1129
  • Last Modified:

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
0
Ezog
Asked:
Ezog
  • 13
  • 12
1 Solution
 
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
 
davidlars99Commented:
or
> Set xmlDoc=Server.CreateObject("microsoft.xmldom")
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
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
 
davidlars99Commented:
so you got it working..?
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

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 13
  • 12
Tackle projects and never again get stuck behind a technical roadblock.
Join Now