当前位置:  开发笔记 > 编程语言 > 正文

使用单引号和双引号编码XPath表达式

如何解决《使用单引号和双引号编码XPath表达式》经验,为你挑选了3个好方法。

XPath(v1)无法编码表达式.

如果您只有单个OR双引号,那么您可以使用诸如的单词

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

但是如果你有两个例如[弗雷德的"Fancy Pizza"]那么你必须在XPath(C++)中使用像Escaping Strings这样的东西来生成

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

任何人都有c#函数来执行此操作?

一些链接很接近

使用MVP.XML库和XPathVariable(一个非常好的解决方案,但对我的需求有点重量级).

不编码"和"存在的位置

为Concat操作添加的参数多于必要的参数, 例如返回//评论[@ name = concat('Fred',''','s','"','Fancy Pizza',''','') ]

编辑:一些答案建议转义'with '和',"但虽然这是有道理的,它不起作用;尝试使用XML片段:


和xpath

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

小智.. 11

哇,你们都肯定会让这个变得复杂.为什么不这样做呢?

public static string XpathExpression(string value)
{
    if (!value.Contains("'"))
        return '\'' + value + '\'';

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

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

.NET小提琴和测试



1> 小智..:

哇,你们都肯定会让这个变得复杂.为什么不这样做呢?

public static string XpathExpression(string value)
{
    if (!value.Contains("'"))
        return '\'' + value + '\'';

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

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

.NET小提琴和测试



2> Robert Rossn..:

虽然它肯定不会在所有情况下都起作用,但这是一种回避问题的方法:

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


我认为`/ @ foo`是错误的:要获得顶级元素的属性,你需要做`/*/@ foo`.所以谓词是`[@Name =/*/@ searchName]`.

3> 小智..:

我需要这个,所以我为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();
    }

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有