29

I am a newcomer to XPath.

I am looking for a way to get all elements whose tag name contains a particular string.

For example, if I have XML like below, I want to get all the elements whose tag name contains the word 'Name'. i.e., I want to fetch the following elements: <SquareName>, <RectangleName>, and <ParallelogramName>.

I tried some combinations of name(), contains() etc., but it did not work. Please suggest.

<Objects>
 <Four-Sided>
   <Square>
      <SquareName>ABCD</SquareName>
      <Length>4</Length>
      <Height>4</Height>
      <Colour>Blue</Colour>
   </Square>
   <Rectangle>
      <RectangleName>EFGH</RectangleName>
      <Length>10</Length>
      <Height>6</Height>
      <Colour>Brown</Colour>
   </Rectangle>
   <Parallelogram>
      <ParallelogramName>WXYZ</ParallelogramName>
      <Length>12</Length>
      <Height>4</Height>
      <Colour>Black</Colour>
   </Parallelogram>
</Four-Sided>
</Objects>
Jens Erat
  • 37,523
  • 16
  • 80
  • 96
user2082317
  • 303
  • 1
  • 3
  • 6

2 Answers2

41

For an XPath solution:

//*[contains(local-name(), 'Name')]
Jens Erat
  • 37,523
  • 16
  • 80
  • 96
  • After looking at the result, I find that among the Elements that is returns, I need to avoid one element with tag name as 'PeriodName'. I can programatically do that but was wondering if XPath has a solution for that also ? – user2082317 Feb 18 '13 at 09:59
  • 2
    You could either use regular expressions or if it's only for this one, another predicate (or combine them using `or`): `//*[contains(local-name(), 'Name')][local-name() != 'PeriodName']` – Jens Erat Feb 18 '13 at 10:03
1

Since there is no Namespace prefix, you can also use

//*[contains(name(), 'Name')]
Serjik
  • 10,543
  • 8
  • 61
  • 70
farooq
  • 170
  • 1
  • 1
  • 8