我正在嘗試決議幾個 RSS 新聞提要,稍后我將根據我正在尋找的內容進行過濾。每個提要都有一個稍微不同的 XML Schema,但通常都有一個 Title、Description、link 和 pubDate。有些使用 CDATA 部分,有些不使用,所以我為使用它的人合并了 if 陳述句。我正在嘗試撰寫一個匹配所有程式的例程。這是一個讓我頭疼的 XML 示例:
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
<channel>
<title><![CDATA[ABC7 RSS Feed]]></title>
<link><![CDATA[https://abc7news.com/feed]]></link>
<lastBuildDate><![CDATA[Thu, 13 Jan 2022 15:49:04 0000]]></lastBuildDate>
<pubDate><![CDATA[Thu, 13 Jan 2022 15:49:04 0000]]></pubDate>
<description>Keep up with news from your local ABC station.</description>
<copyright>Copyright 2022 ABC Inc., KGO-TV San Francisco</copyright>
<managingEditor>[email protected](KGO-TV San Francisco)</managingEditor>
<webMaster>[email protected](KGO-TV San Francisco)</webMaster>
<language><![CDATA[en]]></language>
<item>
<title><![CDATA[Biden gives COVID response update; administration to deploy military teams to hospitals | LIVE]]></title>
<description><![CDATA[Starting next week, 1,000 military medical personnel will begin arriving to help mitigate staffing crunches at hospitals across the country. ]]></description>
<pubDate><![CDATA[Thu, 13 Jan 2022 15:38:02 0000]]></pubDate>
<link><![CDATA[https://abc7news.com/us-covid-biden-speech-today-hospitalizations/11462828/]]></link>
<type><![CDATA[post]]></type>
<guid><![CDATA[https://abc7news.com/us-covid-biden-speech-today-hospitalizations/11462828/]]></guid>
<dc:creator><![CDATA[AP]]></dc:creator>
<media:keywords><![CDATA[us covid, biden covid, biden speech today, covid hospitalizations, omicron variant, us hospitals, covid cases, covid omicron, biden military medical teams]]></media:keywords>
<category><![CDATA[Health & Fitness,omicron variant,Coronavirus,military,joe biden,hospitals,u.s. & world]]></category>
<guid isPermaLink="false">health/live-biden-highlighting-federal-surge-to-help-weather-omicron/11462828/</guid>
</item>
<item>
<title><![CDATA[Massive backup on Bay Bridge after early morning crash]]></title>
<description><![CDATA[A massive backup continues on the Bay Bridge after an earlier multi-vehicle crash past Treasure Island.]]></description>
<pubDate><![CDATA[Thu, 13 Jan 2022 15:30:15 0000]]></pubDate>
<link><![CDATA[https://abc7news.com/bay-bridge-crash-traffic-accident-sf-commute/11463119/]]></link>
<type><![CDATA[post]]></type>
<guid><![CDATA[https://abc7news.com/bay-bridge-crash-traffic-accident-sf-commute/11463119/]]></guid>
<dc:creator><![CDATA[KGO]]></dc:creator>
<media:title><![CDATA[Crash triggers massive backup on Bay Bridge]]></media:title>
<media:description><![CDATA[A crash on the Bay Bridge triggered massive gridlock for the Thursday morning commute.]]></media:description>
<media:videoId>11463404</media:videoId>
<media:thumbnail url="https://cdn.abcotvs.com/dip/images/11463261_011322-kgo-sky7-bay-bridge-traffic-img.jpg" width="1280" height="720" />
<enclosure url="https://vcl.abcotv.net/video/kgo/011322-kgo-6am-bay-bridge-crash-vid.mp4" length="79" type="video/mp4" />
<media:keywords><![CDATA[Bay Bridge crash, traffic, accident, SF commute, Oakland drive times, bay bridge toll plaza backup, Bay Area, treasure island,]]></media:keywords>
<category><![CDATA[Traffic,Treasure Island,Oakland,San Francisco,CHP,bay bridge,crash]]></category>
<guid isPermaLink="false">traffic/massive-backup-on-bay-bridge-after-early-morning-crash/11463119/</guid>
</item>
</channel>
</rss>
這是將每個專案放入物件($posts)的決議代碼:
$rss = [xml] (Get-Content 'I:\RSS_Project\Feeds\feed-3.xml')
$rss.SelectNodes('//item')|%{
$posts = New-Object psobject -Property @{
Title = If($_.Title."#cdata-section"){$_.Title."#cdata-section"}else{$_.Title}
Desc = If($_.description."#cdata-section"){$_.description."#cdata-section"}else{$_.Title}
link = If($_.link."#cdata-section"){$_.link."#cdata-section"}else{$_.link}
pubDate = If($_.pubDate."#cdata-section"){$_.pubDate."#cdata-section"}else{$_.pubDate}
}
}
我得到了這個提要的正確鏈接和 pubDate 但是因為在某些專案中有一個 media:title 和 media:description (在同一個提要中是不一致的),所以我得到 {title,media:title} 輸出到我創建的 $posts.title 自定義物件。
有了這些資料,它將是{清晨崩潰后海灣大橋上的大規模備份,崩潰觸發海灣大橋上的大規模備份}。我不知道如何避免捕獲媒體:標題資料。我的其他 XML 提要沒有媒體:標題。
如果它存在于任何提要中,我可以先發制人并提前洗掉它嗎?我嘗試使用適用于此提要的 $_.Title[0] ,但由于其他提要沒有陣列,因此它不適用于這些提要。我有同樣的問題,媒體:描述存在于專案中。當我有標題或描述陣列時,我將資料輸出到一個僅列出“System.Object”的 HTML 表中。任何有助于消除 media:title 進入我的物件的幫助將不勝感激。
uj5u.com熱心網友回復:
PowerShell 的 XML 型別配接器可能有點“古怪”(因為缺少更好的技術術語),因為它試圖簡化復雜的事情 - 結果,它只是忽略命名空間前綴并通過其本地名稱決議節點,導致$_.title解決<title>和<media:title>元素。
相反,也可以使用 XPath 來決議這些值:
$fields = 'title','description','pubDate','link'
$posts = foreach($item in $rss.SelectNodes('//item')) {
# create dictionary to hold properties of the object we want to construct
$properties = [ordered]@{}
# now let's try to resolve them all
foreach($fieldName in $fields) {
# use a relative XPath expression to extract relevant child node from current item
$value = $item.SelectSingleNode("./${fieldName}")
# handle content wrapped in CData
if($value.HasChildNodes -and $value.ChildNodes[0] -is [System.Xml.XmlCDataSection]){
$value = $value.ChildNodes[0]
}
# add node value to dictionary
$properties[$fieldName] = $value.InnerText
}
# output resulting object
[pscustomobject]$properties
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411833.html
標籤:
