You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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:'
  )
)

为什么这个方案好用:

  1. 直接定位到包含Completion Date:的文本节点——也就是对应这个键值对的那一行,完全不受其他键值对干扰
  2. 提取Completion Date:之后的内容,再用normalize-space()去掉前后多余空格,不管这个日期是中间项还是最后一项都能正常工作
  3. 语法直白,后续维护也容易理解

场景2:BR是文本中的标签字符串

如果BR是以&lt;br/&gt;(或<br/>)的形式嵌在Description的文本内容里,我们可以先统一处理空白和BR,再提取日期:

normalize-space(
  substring-before(
    concat(
      substring-after(normalize-space(./Terms/Description), 'Completion Date:'),
      ' :'
    ),
    ' :'
  )
)

原理说明:

  1. normalize-space(./Terms/Description):把所有换行、BR带来的空白、多余空格都转换成单个空格,同时去掉首尾空格,让整个文本变成紧凑的键值对序列
  2. substring-after(..., 'Completion Date:'):提取Completion Date:之后的所有内容
  3. concat(..., ' :'):在内容末尾加一个虚拟的 :,确保即使日期是最后一项,substring-before也能找到匹配的分隔符
  4. substring-before(..., ' :'):提取到下一个键的 :(对应下一个键值对的结尾)之前的内容
  5. 最后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:46:06