Groups | Blog | Home
all groups > dotnet xml > march 2007 >

dotnet xml : Trouble with XPath query


tschulken
3/15/2007 12:14:36 PM
I have a query where i need to look for a value of a lower level xml
element based on the value of a parent element existing first. Here is
a simple example of the xml

<S3Client>
<Buttons>
<Button>Activity
<RestrictedClientType>
<ClientType>02</ClientType>
</RestrictedClientType>
</Button>
...
</Buttons>
</S3Client>

Here is my query, I am trying see if ClientType '02' exists when the
Button element has a value of "Activity". I wanted to do this in one
xpath query. Any help would be appreciated.
/Security/S3Client/Buttons[Button='Activity']/
RestrictedClientType[ClientType='02']

Tim
tschulken
3/15/2007 5:26:09 PM
[quoted text, click to view]

Bjorn,

That makes sense but it seems that I am having trouble getting it to
work. Since the <RestrictedClientType> was added as a child node of
Button, seems that the first part of my query doesn't work. I guess I
am used to parent nodes just having no values or maybe just attributes
but seems that since Button has a value of "Activity" and then the
child node, does querying for the Activity Text change? Here is an
example, before <RestrictedClientType> was added, this xpath query
would work fine:
_xmlDocument.SelectSingleNode( "/Security/S3Client/Buttons/
Button['Activity']" );

Now that query does not work, any ideas?

Thanks.

Tim
Bjoern Hoehrmann
3/15/2007 10:21:28 PM
* tschulken wrote in microsoft.public.dotnet.xml:
[quoted text, click to view]

For example:

//ClientType[ . = '02' and
ancestor::Button[ normalize-space() = 'Activity' ]

or

/S3Client/Buttons/Button[ normalize-space() = 'Activity' ]/
RestrictedClientType/ClientType[ . = '02' ]

Your expression is basically correct, but you missed the space
characters in the <Button> element.
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
Bjoern Hoehrmann
3/16/2007 2:30:48 AM
* tschulken wrote in microsoft.public.dotnet.xml:
[quoted text, click to view]

Here the content of the <Button> element is this:

1. the word "Activity" followed by
a line feed character followed by space characters
2. the RestrictedClientType element
3. a line feed character followed by space characters

I do not know whether the code above has been pretty printed for
readability, or whether it reflects what is actually in the tree
in memory, but assuming this is how it is in memory your original
.... Button='Activity' ... would not work as that would match if
the content was just 'Activity'.

[quoted text, click to view]

I am not sure whether this is a typo, but this does not do what you
want at all. The string literal 'Activity' is converted to a boolean
(true) so this would select the first 'Button' element that has the
ancestors Buttons, S3Client, Security, in that order. You could also
write

/Security/S3Client/Buttons/Button['HelloWorld']

and the result would be the same.

[quoted text, click to view]

I do not see a reason why this would happen.
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
tschulken
3/16/2007 5:40:34 AM
[quoted text, click to view]

Bjorn,

Yes, what i had was a typo and I apologize. The xpath query should be
"/Security/S3Client/Buttons[Button=3D'Activity']". This used to work for
all Button lookups and now that I added the Child Node for the
"Activity" button, it doesn't work on that one (but still works for
others since they don't have children). Is there a way for a single
query to be used for both scenarios?

Tim
tschulken
3/16/2007 11:03:14 AM
[quoted text, click to view]

Seems that having the child nodes alters the text for the Button so in
the case of the 'Activity' Button, its text is Activity02. Can I just
specify that I don't want to consider the child nodes text at this
point?
AddThis Social Bookmark Button