gpt4 book ai didi

Powershell不显示RSS提要

转载 作者:行者123 更新时间:2023-12-02 23:50:28 25 4
gpt4 key购买 nike

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

谢谢。

最佳答案

您得到的输出意味着 Invoke-RestMethod 按预期工作:它返回了 [xml] ( System.Xml.XmlDocument ) 实例,它是返回的 XML 文本的 XML DOM(文档对象模型)从网站。
不幸的是, [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 ,即about的文本内容路径(从文档根)为 /RDF/channel 的元素的属性,与命名空间无关[2];见 this answer了解更多信息。
  • 使用 [xml]类型的原生属性和方法,例如基于 XPath 的 .SelectNodes() 方法用于从 XML 文档中提取信息;但是,这是 如果涉及 XML 命名空间,则不太方便 (例如您的情况),因为它们需要明确的管理;见 this answer了解更多信息。

  • 如果你想 漂亮地打印 XML 文本 : [xml] ( System.Xml.XmlDocument ) 类型没有对 pretty-print 其文本内容的内置支持。
    虽然可能使用 System.Xml.XmlWriter 例如,这样做既冗长又麻烦;但是,它确实使您可以控制 pretty-print 格式的细节。
    一个实用的、更简单的解决方案是使用 System.Xml.Linq.XDocument 而是键入(不幸的是,PowerShell 不提供点符号),其 .ToString()默认情况下,使用带有两个空格字符的缩进进行 pretty-print ,如以下示例所示:
    # 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提要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60579247/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com