如何使用XPath提取XML字段中无尾随分隔符的日期子字符串?
提取XML中Description字段的Completion Date值
针对你遇到的键值对用BR标签分隔的场景,我给你整理了两种适配不同XML结构的XPath方案,都能避开固定尾随分隔符的限制,同时保持代码清晰:
场景1:BR是独立元素(推荐)
如果你的XML里BR是作为<br/>元素分隔每个键值对(比如每个键值对对应一个单独的文本节点),直接用这个简洁的XPath就够了:
normalize-space( substring-after( ./Terms/Description/text()[contains(., 'Completion Date:')], 'Completion Date:' ) )
为什么这个方案好用:
- 直接定位到包含
Completion Date:的文本节点——也就是对应这个键值对的那一行,完全不受其他键值对干扰 - 提取
Completion Date:之后的内容,再用normalize-space()去掉前后多余空格,不管这个日期是中间项还是最后一项都能正常工作 - 语法直白,后续维护也容易理解
场景2:BR是文本中的标签字符串
如果BR是以<br/>(或<br/>)的形式嵌在Description的文本内容里,我们可以先统一处理空白和BR,再提取日期:
normalize-space( substring-before( concat( substring-after(normalize-space(./Terms/Description), 'Completion Date:'), ' :' ), ' :' ) )
原理说明:
normalize-space(./Terms/Description):把所有换行、BR带来的空白、多余空格都转换成单个空格,同时去掉首尾空格,让整个文本变成紧凑的键值对序列substring-after(..., 'Completion Date:'):提取Completion Date:之后的所有内容concat(..., ' :'):在内容末尾加一个虚拟的:,确保即使日期是最后一项,substring-before也能找到匹配的分隔符substring-before(..., ' :'):提取到下一个键的:(对应下一个键值对的结尾)之前的内容- 最后用
normalize-space()清理掉前后空格,得到干净的日期值
只要你的日期格式里不会出现 :(比如10-Aug-2015这种常见格式),这个方案就完全没问题。
备选:VB端辅助处理(如果XPath太晦涩)
要是你觉得上述XPath的可读性下降了,也可以先用XPath提取整个Description的文本内容,再在VB里做字符串处理,比如:
Dim descText As String = deal.SelectSingleNode("./Terms/Description").InnerText Dim compDateStart As Integer = InStr(descText, "Completion Date:") + Len("Completion Date:") Dim compDateEnd As Integer = InStr(compDateStart, descText, vbCrLf) ' 换成InStr(compDateStart, descText, "<br/>")适配BR文本标签的情况 If compDateEnd = 0 Then compDateEnd = Len(descText) + 1 Dim compDate As String = Trim(Mid(descText, compDateStart, compDateEnd - compDateStart))
这种方式更直观,调试起来也方便,适合追求代码可读性的场景。
内容的提问来源于stack exchange,提问作者Maury Markowitz
相关产品推荐
相关产品推荐

