Encoding XPath Expressions with both single and double quotes

c#, xml, xpath, xpath-1.0

Solution

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

Problem

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 `&apos;` and " with `&quot;` 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'] ```

Original source