還有就是要做到這一點,不是使用HTML ::解碼或註冊其他更通用方式EXPS。它要複雜得多,但它可能是有用的,當一些列,除了鏈接列,包含特殊的HTML字符,不應該像鏈接處理(例如$ PageTitle有類似「foo <酒吧」,什麼會打破標記在使用Html :: Decode之後)。
這種方法使用ConvertTo-Html生成的有效XHTML,可以在Powershell/.Net XML設施中使用。主要想法是將cmdlet輸出轉換爲XML文檔,然後使用XPath檢索鏈接列,並修改它們以使用DOM功能創建鏈接。
這裏是代碼片斷:
$pso = New-Object PSObject -Property @{
SiteUrl = 'foobar.org'
PageTitle = 'x&z a<b<c'
PageUrl = 'foobar.org/contact.html'
} | ConvertTo-Html
$xmlDoc = [xml]$pso
$xhtmlNS = 'http://www.w3.org/1999/xhtml'
$xmlNSManager = New-Object System.Xml.XmlNamespaceManager $xmlDoc.NameTable
$xmlNSManager.AddNamespace('x', $xhtmlNS)
$xmlDoc.SelectNodes('//x:table/x:tr/x:td[3]', $xmlNSManager) | %{
$a = $xmlDoc.CreateElement('a', $xhtmlNS)
$a.setAttribute('href', $_.'#text')
[void]$a.AppendChild($xmlDoc.CreateTextNode('Contact Us'))
[void]$_.ReplaceChild($a, $_.FirstChild)
}
$xmlDoc.OuterXml | Out-File 'test.html'
XPath字符串來檢索第n列的單元是 '// X:表/ X:TR/X:TD [n]的',其中n - 是數列(索引從1開始)。可以在這裏找到關於使用XML命名空間的一些說明(例如XmlNamespaceManager和funky'x:'前綴):Xml Namespace breaking my xpath!
要一次修改多個列,可以使用以下XPath:'// x:table/x:tr/x:td [position()= 1 or position()= 2 or ... or position()= last()]'
foreach ($td in $xmlDoc.SelectNodes('//x:table/x:tr/x:td[position()=1 or position()=2 or ... or position()=last()]', $xmlNSManager)) {
# processing first column cells
[void]$foreach.MoveNext()
# processing second column cells
[void]$foreach.MoveNext()
# etc
}
我應該在哪裏添加這個'Add-Type -AssemblyName System.Web [System.Web.HttpUtility] :: HtmlDecode($ pso)'在腳本開始處? – Nish 2013-03-23 15:26:26
是的,或者在你第一次使用它之前。 – 2013-03-23 17:48:01