【问题标题】:Using substring-after to search text in XPath query使用 substring-after 在 XPath 查询中搜索文本
【发布时间】:2011-04-27 06:01:22
【问题描述】:

我试图通过使用 XPath 查询来解析 XML 节点中的字符串,该查询要求我删除一个子字符串并读取剩余的值。在我获得该值之前,子字符串前后可能有动态数量的空白,因此在 XPath 中使用某种 indexOf 函数会很有帮助。我正在尝试使用 substring-after,但 XPath 很有可能是 1.0,根据this post,这可能会使这更难完成。以下是我尝试解析的 XML 示例:

<root>
   <myField>     StringToParse        7</myField>
</root>

我正在尝试获取字符串中的值 7,这似乎可以通过 substring-after 和 normalize-space 的某种组合来实现。我不完全确定我是否正确使用它,因为无论我尝试使用哪种方式,结果要么是空值,要么是整个字符串,而子字符串没有被删除。

我能够返回整个价值(两害相权取其轻)的方式是:

/myField[substring-after(.,'StringToParse')]

我希望会返回 '7' 谁能告诉我我在语法上做错了,或者如果我应该使用其他方法来完成我想要的事情?

谢谢,

迈克

【问题讨论】:

  • 好问题,+1。有关您遇到的问题的解释以及两种解决方案,请参阅我的答案。

标签: xml search xpath substring


【解决方案1】:

我能够返回整个的方式 价值(两个邪恶中的较小者)是: /myField[substring-after(.,'StringToParse')], 我希望会返回'7' 谁能让我知道我在做什么 错了

你很接近,但表达方式至少有两个问题:

/myField[substring-after(.,'StringToParse')]

  1. myField 不是文档中的顶部元素,此表达式要求选择顶部元素,并且此元素的名称为 myField。如果针对提供的 XML 文档进行评估,则不会选择任何节点,因为提供的 XML 文档中的顶部元素名为 root

  2. substring-after() 的函数调用位于谓词内。这意味着将根据值选择名为myField 的顶部节点对substring-after() 的调用,转换为布尔值。这显然是你想要的——你不想要一个节点——你想要一个字符串!

解决方案

substring-after(/*/myField, 'StringToParse')

计算结果为(不带引号):

"        7"

更好的解决方案可能是

normalize-space(substring-after(/*/myField, 'StringToParse'))

计算结果为

"7"

【讨论】:

  • 这是我想象中的工作方式,但是当我在任何类型的在线 XPath 测试器中尝试它时,这不起作用。它只会炸掉。在我的实际场景中,查询结果是一个空字符串(可能是一个空值) 这可能是 XPath 在 .net 中处理的结果,这是我用来评估查询的平台。我会做更多的测试并回复你。
  • @Mike:那么您还没有向我们展示真正的 XML 文档。我怀疑它可能有一个默认命名空间,这是最常见的常见问题解答。
  • 真正的 XML 文档基本上是一样的,但是这个 XPath 不是在 XSL 中评估的,它实际上是由 .net 中的 System.Xml.XmlNode.SelectSingleNode(string xPath) 方法评估的.我怀疑这是问题所在,因为该方法返回 XmlNode 而不是字符串。当我在这里使用 Xpath 查询工具xmlme.com/XpathTool.aspx 尝试此操作时,它在尝试评估此表达式时给我的错误是“表达式必须评估为节点集”
  • @Mike:使用 XPathNavigator.Evaluate()
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多