2010-10-19 89 views
3

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

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

我试图获得在字符串中的值7,这似乎可能与子,经过一番组合,规范空间。我不完全相信我正确地使用它,因为不管我尝试使用它的方式是什么,结果都是空值或整个字符串,并且未删除子字符串。

我能够返回整个值(两两害取其轻)的方法是:

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

这我希望将回到“7”任何人都可以让我知道我做错了与语法,还是有一个替代方法,我应该用来完成我想要的?

感谢,

迈克

+0

问得好,+1。请参阅我的答案,解释您遇到的问题以及两种解决方案。 – 2010-10-19 01:49:15

回答

4

我能够返回整个 值(两两害取其轻)的方法是: /myField[substring-after(.,'StringToParse')], 我会希望将回到“7” 任何人都可以让我知道我在做 错误

你接近,但也有至少两个亲用表达blems:

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

  1. myField不是文档在顶部元件和该表达式请求将顶部元件被选择并且该元素的名称是myField。如果根据提供的XML文档进行评估,则不会选择节点,因为所提供的XML文档中的顶层元素名为root

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

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

的计算结果为(没有引号):

"  7" 

更好的解决方案可以是

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

这个评估只是

"7" 
+0

这就是我想象的那样工作,但是当我在任何一种在线XPath测试器中尝试时,这都不起作用。它只是炸弹出来。在我的活动场景中,查询结果为空字符串(可能为空值)这可能是XPath在.net中处理的结果,这是我用来评估查询的平台。我会做更多的测试并回复你。 – mclark1129 2010-10-19 02:07:11

+0

@Mike:那么你没有向我们展示真正的XML文档。我怀疑它可能有一个默认名称空间,这是一个众所周知的答案最常见的问题。 – 2010-10-19 02:47:58

+0

真正的XML文档基本上是一样的,但是这个XPath并没有在XSL中进行评估,实际上它是通过.net中的System.Xml.XmlNode.SelectSingleNode(string xPath)方法进行评估的。我怀疑这是问题的原因,因为该方法返回一个XmlNode而不是一个字符串。当我在这里使用Xpath查询工具在这里http://www.xmlme.com/XpathTool.aspx尝试这样做时,它在尝试评估此表达式时给出的错误是“表达式必须评估为节点集” – mclark1129 2010-10-19 13:20:49