tags:

views:

2839

answers:

9

I haven't used XPath much nor read through tutorials.

Given this XML, what XPath returns the first three nodes:

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
+1  A: 

Have you tried something like:

//a[contains(@prop, "Foo")]

I've never used the contains function before but suspect that it should work as advertised...

toddk
@toddk... you've targeted a non-existant attribute: @foo. You'd want to target @prop ;-)
Metro Smurf
+2  A: 

/bla/a[contains(@prop, "foo")]

David Hill
+1  A: 

For the code above... //*[contains(@prop,'foo')]

digiguru
this is for any element with foo in, but the attribute must be "prop"
digiguru
+1  A: 

try this:

//a[contains(@prop,'foo')]

that should work for any "a" tags in the document

Dani Duran
+12  A: 
//a[contains(@prop,'Foo')]

Works if I use this XML to get results back.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

This site is great for testing this kind of thing

http://www.xmlme.com/XpathTool.aspx

Edit: Another thing to note is that while the XPath above will return the correct answer for that particular xml, if you want to guarantee you only get the "a" elements in element "blah", you should as others have mentioned also use

/bla/a[contains(@prop,'Foo')]

This will search you all "a" elements in your entire xml document, regardless of being nested in a "blah" element

//a[contains(@prop,'Foo')]

I added this for the sake of thoroughness and in the spirit of stackoverflow. :)

evilhomer
+3  A: 

John C is the closest, but XPath is case sensitive, so the correct XPath would be:

/bla/a[contains(@prop, 'Foo')]
Metro Smurf
A: 

/bla[a<4]/a

http://www.w3schools.com/XPath/xpath_examples.asp

hal10001
You failed to note the title of the question.
Jeremy Stein
+2  A: 
descendant-or-self::*[contains(@prop,'Foo')]

Or:

/bla/a[contains(@prop,'Foo')]

Or:

/bla/a[position() <= 3]

Dissected:

descendant-or-self::

The Axis - search through every node underneath and the node itself. It is often better to say this than //. I have encountered some implementations where // means anywhere (decendant or self of the root node). The other use the default axis.

* or /bla/a

The Tag - a wildcard match, and /bla/a is an absolute path.

[contains(@prop,'Foo')] or [position() <= 3]

The condition within [ ]. @prop is shorthand for attribute::prop, as attribute is another search axis. Alternatively you can select the first 3 by using the position() function.

1729
A: 

This XPath will give you all nodes that have attributes containing 'Foo' regardless of node name or attribute name:

//attribute::*[contains(., 'Foo')]/..

Of course, if you're more interested in the contents of the attribute themselves, and not necessarily their parent node, just drop the /..

//attribute::*[contains(., 'Foo')]
Alex Beynenson