热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:使用单引号和双引号编码XPath表达式分享

使用单引号和双引号编码XPath表达式XPath(v1)无法编码表达式。如果您只有单个OR双引号,那么您可以使用诸如的单词review[@name"Bob'sP

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

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#函数来执行此操作?

一些链接很接近

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

  

和xpath

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

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

 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  

这就是我想出来的

 public static string EncaseXpathString(string input) { // If we don't have any " then encase string in " if (!input.Contains(""")) return String.Format(""{0}"", input); // If we have some " but no ' then encase in ' if (!input.Contains("'")) return String.Format("'{0}'", input); // If we get here we have both " and ' in the string so must use Concat StringBuilder sb = new StringBuilder("concat("); // Going to look for " as they are LESS likely than ' in our data so will minimise // number of arguments to concat. int lastPos = 0; int nextPos = input.IndexOf("""); while (nextPos != -1) { // If this is not the first time through the loop then seperate arguments with , if (lastPos != 0) sb.Append(","); sb.AppendFormat(""{0}",'"'", input.Substring(lastPos, nextPos - lastPos)); lastPos = ++nextPos; // Find next occurance nextPos = input.IndexOf(""", lastPos); } sb.Append(")"); return sb.ToString(); } 

叫做类似的东西

 XmlNode node = doc.SelectSingleNode("//review[@name=" + EncaseXpathString("Fred's "Fancy Pizza"" + "]") 

所以我们得到以下结果

 EncaseXpathString("Pizza Shed") == "'Pizza Shed'"; EncaseXpathString("Bob's pizza") == ""Bob's Pizza""; EncaseXpathString(""Pizza" Pam" == "'"Pizza" Pam'"; EncaseXpathString("Fred's "Fancy Pizza"") == "concat("Fred's ",'"',"Fancy Pizza",'"')"; 

所以它只在必要时才使用concat(字符串中的“和”)

最后的结果显示concat操作并不尽可能短(请参阅问题),但它足够接近并且任何更优化都会非常复杂,因为您必须寻找匹配的“或”对。

到目前为止,我遇到了所有解决方案的问题。 一个有额外的文本部分(例如’“’或”’),它打破了你正在寻找的东西。一个删除了最后一个引用/ dblquote之后的所有文本,它也会中断。

这是一个愚蠢的vb开发人员的愚蠢而快速的解决方案:

 Function ParseXpathString(ByVal input As String) As String input = Replace(input, "'", Chr(1)) input = Replace(input, """", Chr(2)) input = Replace(input, Chr(1), "',""'"",'") input = Replace(input, Chr(2), "','""','") input = "concat('','" + input + "')" Return input End Function 

用法(与前面的例子相同):

 x.SelectNodes("/path[@attr=" & ParseXpathString(attrvalue) & "]") 

我需要在XSLT本身中执行此操作,因此基于此页面上的答案提出以下内容:

    " '  '' ""  concat(     , "'",      )    

另一种变化……我的concat()部分有点懒,但至少它使用了整个值。

  ///  /// Returns an XPath string literal to use for searching attribute values (wraped in apostrophes, quotes, or as a concat function). ///  /// Attribute value to encode and wrap. public static string CreateXpathLiteral(string attributeValue) { if (!attributeValue.Contains(""")) { // if we don't have any quotes, then wrap string in quotes... return string.Format(""{0}"", attributeValue); } else if (!attributeValue.Contains("'")) { // if we have some quotes, but no apostrophes, then wrap in apostrophes... return string.Format("'{0}'", attributeValue); } else { // must use concat so the literal in the XPath will find a match... return string.Format("concat("{0}")", attributeValue.Replace(""", "",'"',"")); } } 

加入这个有趣的事物

 public string XPathLiteral(string text) { const string APOS = "'"; const string QUOTE = @""""; int pos = 0; int posApos; int posQuote; posQuote = text.IndexOf(QUOTE, pos); if (posQuote <0) { return QUOTE + text + QUOTE; }//if posApos = text.IndexOf(APOS, pos); if (posApos <0) { return APOS + text + APOS; }//if bool cOntainsApos= posApos  

url: http : //vaibhavgaikwad.wordpress.com/2007/10/04/handling-apostrophe-single-quote-in-xpath-expressions-in-net/

引用:

  public static string GetXPathString(string input) { string[] fragments = input.Split(new char[] { '” }); string result = “”; result += “concat(””; for (int i = 0; i  

以下是修改上述代码以便使用我们的新函数的方法://记得在=和之后删除单引号

 XmlNode n = doc.SelectSingleNode(“/root/emp[@lname=" + GetXPathString(ln) + "]“); 

或者只是像之前的post那样建议。 使用'和'替换'和'一个简单的function。

上述就是C#学习教程:使用单引号和双引号编码XPath表达式分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---编程笔记


推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
author-avatar
手机用户2502897855
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有