PowerShell不显示RSS源 [英] Powershell not displaying rss feed
问题描述
我正在尝试使用Powershell解析RSS提要,但是当我使用Invoke-RestMethod时,这是我得到的唯一输出:
xml RDF
--- ---
version="1.0" encoding="UTF-8" RDF
我在不显示任何内容的多个RSS源中遇到过此问题,如何才能使其正常工作,以便在使用Invoke-RestMethod时实际显示RSS源?
$url = 'http://www.aero-news.net/news/rssfeed.xml'
Invoke-RestMethod -Uri $url
谢谢。
xml
您得到的输出暗示Invoke-RestMethod
工作正常:它返回了一个[xml]
(System.Xml.XmlDocument
)实例,该实例是从网站返回的推荐答案文本的xmlDOM(文档对象模型)。
很遗憾,[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通过基于属性的点表示法方便地适配XML DOM;例如,
$xml.RDF.channel.about
返回字符串http://www.aero-news.net
,这是路径(从文档根)为/RDF/channel
,的元素的about
属性的文本内容使用
[xml]
类型的本机属性和方法(如基于XPath的.SelectNodes()
方法)从XML文档提取信息;但是,如果涉及XML命名空间(如您的案例),就不太方便,因为它们需要显式管理;有关详细信息,请参阅this answer。
如果要漂亮打印XML文本:
[xml]
(System.Xml.XmlDocument
)类型没有内置的对漂亮打印其文本内容的支持。
虽然可以使用System.Xml.XmlWriter
实例,但这样做既繁琐又麻烦;但是,它确实让您能够控制漂亮打印格式的细节。
一个实用、简单得多的解决方案是改用System.Xml.Linq.XDocument
类型(不幸的是,PowerShell没有为提供点符号),其.ToString()
方法在默认情况下使用带有两个空格字符的缩进来美观地打印,如下面的示例所示:
# 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()
}
}
}
现在您可以使用以下内容来美化打印原始的$xml
变量(通过Invoke-RestMethod
获得):
# Outputs a pretty-printed version of the document's XML text.
$xml | Format-Xml
[1]显示的是文档的XML声明的内容,作为属性
.xml
,以及文档(根)元素的名称,作为以其自身命名的属性。打印文档中的任何给定元素的工作方式如下:如果元素既没有属性也没有子元素,则打印其文本内容(文本子节点)(如果有)。否则,将打印其属性及其值,后跟为子元素命名的属性,如果它们本身具有属性和/或子元素,则每个属性也由其名称表示为属性值,否则由其文本内容(如果有)表示。
[2]处理其标题包含给定词的所有源项目并将其转换为自定义对象的示例命令。
$userTerm = 'Quote'
$xml.RDF.Item | ? Title -like "*$userTerm*" | % {
[PSCustomObject]@{
Source = "aero"
Title = $_.Title
Link = $_.Link
Description = $_.description
}
}
这篇关于PowerShell不显示RSS源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!