PowerShell不显示RSS源 [英] Powershell not displaying rss feed

查看:26
本文介绍了PowerShell不显示RSS源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆