如何在XPath查询中使用嵌套字符串函数提取冒号后子串?
解决XPath嵌套字符串函数提取文本的问题
嗨,我来帮你搞定这个XPath的问题!你之前的写法有个关键问题:contains()函数返回的是布尔值(true/false),而substring-after()需要的是字符串参数,直接嵌套肯定行不通。下面给你两种正确的实现方式:
1. 先过滤节点再提取文本
如果你既要定位到符合条件的cbc:Note节点,又要提取冒号后的内容,可以这样写XPath:
cbc:Note[contains(text(), 'Fatura Tipi:')]/substring-after(text(), 'Fatura Tipi:')
逻辑很清晰:
- 先用
[contains(text(), 'Fatura Tipi:')]筛选出包含目标文本的节点 - 再对该节点的文本内容调用
substring-after(),提取'Fatura Tipi:'之后的所有内容
2. 直接提取目标文本值
如果只需要提取文本内容,不需要保留节点本身,可以简化为:
substring-after(//cbc:Note[contains(text(), 'Fatura Tipi:')]/text(), 'Fatura Tipi:')
这个写法会先找到符合条件的节点文本,再直接截取你需要的部分。
注意:命名空间的重要性
在C#代码里使用这个XPath时,别忘了注册cbc对应的命名空间!XML里的前缀cbc肯定绑定了某个命名空间URI,你必须在XmlNamespaceManager里添加它,否则XPath会找不到节点。举个代码示例:
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("你的XML文件路径"); // 注册命名空间(替换成实际的cbc命名空间URI) XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable); nsManager.AddNamespace("cbc", "http://example.com/your-cbc-namespace"); // 提取目标文本 string result = xmlDoc.SelectSingleNode( "substring-after(//cbc:Note[contains(text(), 'Fatura Tipi:')]/text(), 'Fatura Tipi:')", nsManager )?.Value;
这样执行后,result就会得到你想要的"MM Alınan Mlz.İade"啦!
内容的提问来源于stack exchange,提问作者ilhan
相关产品推荐
相关产品推荐

