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
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's Pizza']
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).
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.
When using double quotes "" to create a string literal, the double quote character needs to be escaped using a backslash: \" .
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.
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
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]");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With