Reputation: 13686
I want to extract name attribute value from the following tag
<application
comments="Do not erase this one"
executable="run_CIET"
icon="default"
instances="1"
mode="1"
name="CIET"
order="10"
selection="1"
tool="y"
/>
I can easily get value of name attribute value based on mode value as shown below
xpath Applications.xml '//applications/application[@mode='3']'/@name
But if I want to add more condtion which is "get name attribute value when mode=X and tool attribute is not there in application tag"
How do we do this? I tried something like
xpath Applications.xml '//applications/application[@mode='3' and !@tool]'/@name
but its not working.
I have not used XPath before and I am finding it tricky I search W3C help on XPath but did not find what I wanted. Please help.
Upvotes: 13
Views: 36373
Reputation: 243549
How do we do this? I tried something like
xpath Applications.xml '//applications/application[@mode='3' and !@tool]'/@name
but its not working.
!@tool
is invalid syntax in XPath. There is an !=
operator, but no !
operator.
Use:
//applications/application[@mode='3' and not(@tool)]/@name
There are two things you should always try to avoid:
using the !=
operator -- it has weird definition and doesn't behave like the not()
function --never use it if one of the operands is a node-set.
Try to avoid as much as possible using the //
abbreviation -- this may cause signifficant inefficiency and also has anomalous behavior that isn't apperent to most people.
Upvotes: 18
Reputation: 12075
Using not(@tool)
instead of !@tool
should do the job. If your XPath engine's not behaving you could conceivably do count(@tool)=0
, but that shouldn't be necessary.
Upvotes: 6