Powershell 不显示 rss 提要
Powershell not displaying rss feed
我正在尝试使用 powershell 解析 RSS 提要,但是当我使用 Invoke-RestMethod 时,这是我得到的唯一输出:
xml RDF
--- ---
version="1.0" encoding="UTF-8" RDF
我在使用 Invoke-RestMethod 时遇到了多个 rss 提要的问题,其中没有任何显示,如何让它工作以便实际显示 RSS 提要?
$url = 'http://www.aero-news.net/news/rssfeed.xml'
Invoke-RestMethod -Uri $url
谢谢。
Invoke-WebRequest 将 RSS 提要数据解析为 xml。您可以像访问普通对象一样访问数据。演示:
$feed = [xml]( invoke-webrequest "https://arminreiter.com/feed/" )
$feed.rss.channel.item | Select-Object @{Name="Id";Expression={$_."post-id".InnerText}}, title, link, pubDate
您得到的输出意味着 Invoke-RestMethod
按预期工作:它 返回了一个 [xml]
(System.Xml.XmlDocument
) 作为 XML DOM(文档 object 模型)的 XML text[= 实例108=] 从站点返回。
不幸的是,默认显示格式 [xml]
实例,如您的问题所示,不是很有帮助 [1],但所有信息都在那里,您可以通过访问 .OuterXml
属性 来简单地验证:
# Get the XML DOM object parsed from the website's XML text output.
$xml = Invoke-RestMethod 'http://www.aero-news.net/news/rssfeed.xml'
# Output its text representation.
$xml.OuterXml
上面打印了一个字符串如:
<?xml version="1.0" encoding="iso-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="http://www.aero-news.net">
<title>Aero-News Network</title>
<description>Daily, Real-Time news and information critical to aviation and aerospace personnel the world over. Aero-News provides daily newsletter summaries, RSS feeds, and numerous personal and professional syndication and news distribution options to insure that aviators, the world over, are kept up to date on information of critical concern.</description>
<link>http://www.aero-news.net</link>
...
因此您可以照常使用 [xml]
(XmlDocument
) 实例:
使用 PowerShell 通过 property-based dot-notation[=108 对 XML DOM 的方便改编=];例如,$xml.RDF.channel.about
returns字符串http://www.aero-news.net
,即元素的about
属性的文本内容 其路径(从文档根目录开始)为 /RDF/channel
,不考虑名称spaces[2];有关详细信息,请参阅 this answer。
使用 [xml]
类型的本机属性和方法,如 XPath-based .SelectNodes()
method for extracting information from the XML document; however, this is less convenient if XML namespaces are involved (such as in your case), because they require explicit management; see this answer 了解更多信息。
如果你想pretty-print XML 文本:
[xml]
(System.Xml.XmlDocument
) 类型 built-in 不支持 pretty-print 其文本内容。
虽然可以使用 System.Xml.XmlWriter
实例,但这样做既冗长又麻烦;但是,它确实让您可以控制 pretty-printing 格式的 细节 。
一个更实用、更简单的解决方案是使用 System.Xml.Linq.XDocument
类型(不幸的是,PowerShell 不 提供点符号),其 .ToString()
方法 pretty-prints 默认 ,使用两个 space 字符的缩进,如下例所示:
# Create a sample XmlDocument instance, as would be returned
# from an Invoke-RestMethod call (from a site returning XML text):
$xml = [xml] ('<?xml version="1.0"?><catalog><book id="bk101"><title>De Profundis</title></book></catalog>')
# Cast to [System.Xml.Linq.XDocument] via .OuterXml; the former's
# .ToString() method then pretty-prints automatically.
([System.Xml.Linq.XDocument] $xml.OuterXml).ToString()
以上生成以下字符串:
<catalog>
<book id="bk101">
<title>De Profundis</title>
</book>
</catalog>
请注意,XML 声明 未包含在 中,但您可以轻松地自己添加它:
$xd = [System.Xml.Linq.XDocument] $xml.OuterXml
$xd.Declaration.ToString() + "`n" + $xd.ToString()
以下 Format-Xml
便利函数 包装了此功能:
function Format-Xml {
param(
[Parameter(ValueFromPipeline)]
[xml] $Xml
)
process {
$xd = [System.Xml.Linq.XDocument] $Xml.OuterXml
if ($xd.Declaration) {
$str = $xd.ToString()
$newline = ("`n", "`r`n")[$str.Contains("`r`n")]
$xd.Declaration.ToString() + $newline + $str
}
else {
$xd.ToString()
}
}
}
现在您可以对 pretty-print 原始 $xml
变量(通过 Invoke-RestMethod
获得)使用以下内容:
# Outputs a pretty-printed version of the document's XML text.
$xml | Format-Xml
[1] 显示的是文档的 XML 声明为 属性 .xml
的内容,以及文档的名称(root)元素作为以自身命名的 属性。打印文档中的任何给定元素的工作方式如下:如果元素既没有属性也没有 child 元素,则打印其文本内容(文本 child 节点)(如果有)。否则,它的属性和它们的值被打印出来,后面跟着以 child 元素命名的属性,每个属性也由它们的名称表示为 属性 value,如果它们and/or child 元素本身具有属性,否则由其文本内容(如果有)决定。
[2] 处理标题包含给定词的所有提要项目并将其转换为自定义 objects.
的示例命令
$userTerm = 'Quote'
$xml.RDF.Item | ? Title -like "*$userTerm*" | % {
[PSCustomObject]@{
Source = "aero"
Title = $_.Title
Link = $_.Link
Description = $_.description
}
}
我正在尝试使用 powershell 解析 RSS 提要,但是当我使用 Invoke-RestMethod 时,这是我得到的唯一输出:
xml RDF
--- ---
version="1.0" encoding="UTF-8" RDF
我在使用 Invoke-RestMethod 时遇到了多个 rss 提要的问题,其中没有任何显示,如何让它工作以便实际显示 RSS 提要?
$url = 'http://www.aero-news.net/news/rssfeed.xml'
Invoke-RestMethod -Uri $url
谢谢。
Invoke-WebRequest 将 RSS 提要数据解析为 xml。您可以像访问普通对象一样访问数据。演示:
$feed = [xml]( invoke-webrequest "https://arminreiter.com/feed/" )
$feed.rss.channel.item | Select-Object @{Name="Id";Expression={$_."post-id".InnerText}}, title, link, pubDate
您得到的输出意味着 Invoke-RestMethod
按预期工作:它 返回了一个 [xml]
(System.Xml.XmlDocument
) 作为 XML DOM(文档 object 模型)的 XML text[= 实例108=] 从站点返回。
不幸的是,默认显示格式 [xml]
实例,如您的问题所示,不是很有帮助 [1],但所有信息都在那里,您可以通过访问 .OuterXml
属性 来简单地验证:
# Get the XML DOM object parsed from the website's XML text output.
$xml = Invoke-RestMethod 'http://www.aero-news.net/news/rssfeed.xml'
# Output its text representation.
$xml.OuterXml
上面打印了一个字符串如:
<?xml version="1.0" encoding="iso-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="http://www.aero-news.net">
<title>Aero-News Network</title>
<description>Daily, Real-Time news and information critical to aviation and aerospace personnel the world over. Aero-News provides daily newsletter summaries, RSS feeds, and numerous personal and professional syndication and news distribution options to insure that aviators, the world over, are kept up to date on information of critical concern.</description>
<link>http://www.aero-news.net</link>
...
因此您可以照常使用 [xml]
(XmlDocument
) 实例:
使用 PowerShell 通过 property-based dot-notation[=108 对 XML DOM 的方便改编=];例如,
$xml.RDF.channel.about
returns字符串http://www.aero-news.net
,即元素的about
属性的文本内容 其路径(从文档根目录开始)为/RDF/channel
,不考虑名称spaces[2];有关详细信息,请参阅 this answer。使用
[xml]
类型的本机属性和方法,如 XPath-based.SelectNodes()
method for extracting information from the XML document; however, this is less convenient if XML namespaces are involved (such as in your case), because they require explicit management; see this answer 了解更多信息。
如果你想pretty-print XML 文本:
[xml]
(System.Xml.XmlDocument
) 类型 built-in 不支持 pretty-print 其文本内容。
虽然可以使用 System.Xml.XmlWriter
实例,但这样做既冗长又麻烦;但是,它确实让您可以控制 pretty-printing 格式的 细节 。
一个更实用、更简单的解决方案是使用 System.Xml.Linq.XDocument
类型(不幸的是,PowerShell 不 提供点符号),其 .ToString()
方法 pretty-prints 默认 ,使用两个 space 字符的缩进,如下例所示:
# Create a sample XmlDocument instance, as would be returned
# from an Invoke-RestMethod call (from a site returning XML text):
$xml = [xml] ('<?xml version="1.0"?><catalog><book id="bk101"><title>De Profundis</title></book></catalog>')
# Cast to [System.Xml.Linq.XDocument] via .OuterXml; the former's
# .ToString() method then pretty-prints automatically.
([System.Xml.Linq.XDocument] $xml.OuterXml).ToString()
以上生成以下字符串:
<catalog>
<book id="bk101">
<title>De Profundis</title>
</book>
</catalog>
请注意,XML 声明 未包含在 中,但您可以轻松地自己添加它:
$xd = [System.Xml.Linq.XDocument] $xml.OuterXml
$xd.Declaration.ToString() + "`n" + $xd.ToString()
以下 Format-Xml
便利函数 包装了此功能:
function Format-Xml {
param(
[Parameter(ValueFromPipeline)]
[xml] $Xml
)
process {
$xd = [System.Xml.Linq.XDocument] $Xml.OuterXml
if ($xd.Declaration) {
$str = $xd.ToString()
$newline = ("`n", "`r`n")[$str.Contains("`r`n")]
$xd.Declaration.ToString() + $newline + $str
}
else {
$xd.ToString()
}
}
}
现在您可以对 pretty-print 原始 $xml
变量(通过 Invoke-RestMethod
获得)使用以下内容:
# Outputs a pretty-printed version of the document's XML text.
$xml | Format-Xml
[1] 显示的是文档的 XML 声明为 属性 .xml
的内容,以及文档的名称(root)元素作为以自身命名的 属性。打印文档中的任何给定元素的工作方式如下:如果元素既没有属性也没有 child 元素,则打印其文本内容(文本 child 节点)(如果有)。否则,它的属性和它们的值被打印出来,后面跟着以 child 元素命名的属性,每个属性也由它们的名称表示为 属性 value,如果它们and/or child 元素本身具有属性,否则由其文本内容(如果有)决定。
[2] 处理标题包含给定词的所有提要项目并将其转换为自定义 objects.
的示例命令$userTerm = 'Quote'
$xml.RDF.Item | ? Title -like "*$userTerm*" | % {
[PSCustomObject]@{
Source = "aero"
Title = $_.Title
Link = $_.Link
Description = $_.description
}
}