如何将RSS源中不同命名的发布日期属性统一为单个属性?
统一RSS源发布日期字段的高效处理方案
问题根源分析
你之前的代码无效,核心问题是判断逻辑错误:$_.pubDate -eq $true完全不成立,因为pubDate是日期字符串而非布尔值,导致代码始终尝试取不存在的published字段,自然会出现空值。而且硬编码判断的方式确实扩展性极差,新增字段就得改代码。
高效解决方案
我们可以通过定义日期属性候选列表+动态检测属性存在性的方式,实现可扩展的字段统一:
- 先定义所有可能的RSS日期字段名(按优先级排序,优先匹配常用字段)
- 针对每个条目,自动遍历候选列表,取第一个存在且非空的日期值
- 同时兼容不同RSS标准的条目容器(比如RSS2.0的
item、Atom的entry)
完整代码示例
# 目标RSS源地址 $urls = "https://www.muddycolors.com/feed", "https://www.youtube.com/feeds/videos.xml?channel_id=UCB9bffMHdIBuvDq1KSelZAg" # 定义所有可能的日期字段名,新增字段直接加在这里即可 $datePropertyCandidates = 'pubDate', 'published', 'dc:date', 'created' # 获取所有RSS源数据并统一处理 $unifiedFeedEntries = $urls | ForEach-Object { $feed = Invoke-RestMethod $_ # 兼容不同RSS标准的条目容器:RSS2.0用item,Atom用entry $entries = if ($feed.item) { $feed.item } elseif ($feed.entry) { $feed.entry } else { $feed } $entries | ForEach-Object { # 遍历候选列表,找到第一个存在且非空的日期值 $publishedDate = $datePropertyCandidates | ForEach-Object { $propName = $_ if ($propName -in $_.PSObject.Properties.Name -and $null -ne $_.$propName) { return $_.$propName } } | Select-Object -First 1 # 输出统一结构的对象 [PSCustomObject]@{ Title = $_.Title Link = if ($_.Link -is [array]) { $_.Link.href -join ' ' } else { $_.Link } Published = $publishedDate } } } # 查看处理后的结果 $unifiedFeedEntries | Format-Table Title, Published, Link -AutoSize
方案优势
- 扩展性强:以后遇到新的日期字段名(比如某些源用
created),只需要添加到$datePropertyCandidates列表里,无需修改核心逻辑 - 兼容性好:自动适配不同RSS标准的条目容器,不用单独处理每个源的结构
- 鲁棒性高:仅取存在且非空的日期值,避免空值或无效值
内容的提问来源于stack exchange,提问作者Ralf_Reddings
相关产品推荐
相关产品推荐

