Saltar al contenido

Codificación de expresiones XPath con comillas simples y dobles

Tenemos la solución a esta interrogante, al menos eso creemos. Si tienes dudas deja tu comentario, que para nosotros será un gusto responderte

Solución:

Wow, seguro que todos ustedes están haciendo esto complicado. ¿Por qué no hacer esto?

public static string XpathExpression(string value)

    if (!value.Contains("'"))
        return ''' + value + ''';

    else if (!value.Contains("""))
        return '"' + value + '"';

    else
        return "concat('" + value.Replace("'", "',"'",'") + "')";

.NET Violín y prueba

Aunque ciertamente no funcionará en todas las circunstancias, aquí hay una manera de evitar el problema:

doc.DocumentElement.SetAttribute("searchName", name);
XmlNode n = doc.SelectNodes("//review[@name=/*/@searchName]");

Necesitaba esto, así que creé esta solución para C#.

    /// 
    /// Returns a valid XPath statement to use for searching attribute values regardless of 's or "s
    /// 
    /// Attribute value to parse
    /// Parsed attribute value in concat() if needed
    public static string GetXpathStringForAttributeValue(string attributeValue)
    
        bool hasApos = attributeValue.Contains("'");
        bool hasQuote = attributeValue.Contains(""");

        if (!hasApos)
        
            return "'" + attributeValue + "'";
        
        if (!hasQuote)
        
            return """ + attributeValue + """;
        

        StringBuilder result = new StringBuilder("concat(");
        StringBuilder currentArgument = new StringBuilder();
        for (int pos = 0; pos < attributeValue.Length; pos++)
        
            switch (attributeValue[pos])
            
                case ''':
                    result.Append('"');
                    result.Append(currentArgument.ToString());
                    result.Append("'",");
                    currentArgument.Length = 0;
                    break;
                case '"':
                    result.Append(''');
                    result.Append(currentArgument.ToString());
                    result.Append(""',");
                    currentArgument.Length = 0;
                    break;
                default:
                    currentArgument.Append(attributeValue[pos]);
                    break;
            
        
        if (currentArgument.Length == 0)
        
            result[result.Length - 1] = ')';
        
        else
        
            result.Append("'");
            result.Append(currentArgument.ToString());
            result.Append("')");
        
        return result.ToString();
    

Si sostienes algún reparo y capacidad de aumentar nuestro ensayo te invitamos realizar un paráfrasis y con deseo lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *