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小提琴和测试
哇,你们都肯定会让这个变得复杂.为什么不这样做呢?
public static string XpathExpression(string value) { if (!value.Contains("'")) return '\'' + value + '\''; else if (!value.Contains("\"")) return '"' + value + '"'; else return "concat('" + value.Replace("'", "',\"'\",'") + "')"; }
.NET小提琴和测试
虽然它肯定不会在所有情况下都起作用,但这是一种回避问题的方法:
doc.DocumentElement.SetAttribute("searchName", name); XmlNode n = doc.SelectNodes("//review[@name=/*/@searchName]");
我需要这个,所以我为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(); }