Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Encoding XPath Expressions with both single and double quotes

XPath (v1) contains no way to encode expressions.

If you only have single OR double quotes then you can use expressions such as

//review[@name="Bob's Pizza"] //review[@name='"Pizza" Pam'] 

But if you have BOTH e.g [Fred's "Fancy Pizza"] then you have to use something like this Escaping Strings in XPath (C++) to generate

//review[@name=Concat("Fred's ",'"Fancy Pizza"')] 

Anyone have a function in c# to do this?

Some links that are close

  • Use the MVP.XML library and XPathVariable (a very good solution but a bit heavyweight for my needs).
  • Doesn't encode where both " and ' are present
  • Adds more arguments to the Concat operation than is necessary e.g. would return //review[@name=concat('Fred', "'", 's ', '"', 'Fancy Pizza', '"', '')]

EDIT: A few answers have suggested escaping ' with ' and " with " but although this makes sense it does not work; try it using the XML fragment:

<review name="Bob's Pizza"/> 

and the xpath

//review[@name='Bob&apos;s Pizza'] 
like image 579
Ryan Avatar asked Mar 13 '09 10:03

Ryan


People also ask

How XPath handle single quotes?

XPath's string literals can't contain both types of quotes; you need to construct the string using the XPath concat function. text()=concat('"That', "'", 's mine", he said. ') And then you'd have to escape the quotes from Ruby (using %{} would be easiest).

How do you escape special characters in XPath?

There is no way to escape characters at the XPath level, so you can't have a literal XPath string containing both kinds of quote.

How do you encode double quotes?

When using double quotes "" to create a string literal, the double quote character needs to be escaped using a backslash: \" .

What is the difference between single quote and double quote in sql?

Single quotes are used to indicate the beginning and end of a string in SQL. Double quotes generally aren't used in SQL, but that can vary from database to database. Stick to using single quotes. That's the primary use anyway.


2 Answers

Wow, you all sure are making this complicated. Why not just do this?

public static string XpathExpression(string value) {     if (!value.Contains("'"))         return '\'' + value + '\'';      else if (!value.Contains("\""))         return '"' + value + '"';      else         return "concat('" + value.Replace("'", "',\"'\",'") + "')"; } 

.NET Fiddle & test

like image 165
Kaleb Avatar answered Sep 30 '22 06:09

Kaleb


Though it certainly won't work in all circumstances, here's a way to sidestep the problem:

doc.DocumentElement.SetAttribute("searchName", name); XmlNode n = doc.SelectNodes("//review[@name=/*/@searchName]"); 
like image 41
Robert Rossney Avatar answered Sep 30 '22 05:09

Robert Rossney