我的目的是针对这个问题给出建议,删除两个字符串之间的所有内容(包括),使用HTMLDocument 解析器而不是基于文本的replace
命令。
但不知何故,元素OuterHTML
的属性<aside>
不包括相关元素,直到</aside>
结束标记:
html
$Html = @'
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Some header elements</h1>
<aside>
<p>huge text in between aside</p>
</aside>
<div>
<p>huge text in between div</p>
</div>
<p>Some other elements</p>
</body>
</html>
'@
解析
function ParseHtml($String) {
$Unicode = [System.Text.Encoding]::Unicode.GetBytes($String)
$Html = New-Object -Com 'HTMLFile'
if ($Html.PSObject.Methods.Name -Contains 'IHTMLDocument2_Write') {
$Html.IHTMLDocument2_Write($Unicode)
}
else {
$Html.write($Unicode)
}
$Html.Close()
$Html
}
$Document = ParseHtml $Html
<aside>
$Document.getElementsByTagName('aside') | ForEach-Object { $_.OuterHTML }
<ASIDE>
<div>
$Document.getElementsByTagName('div') | ForEach-Object { $_.OuterHTML }
<DIV><P>huge text in between div</P></DIV>
- 该元素有何特殊之处,
<aside>
可以解释其与其他元素的区别,例如<div>
? <aside>
包含整个元素直至结束标记的正确方法是什么</aside>
?
我相信C3roe和Mathias在评论中已经给出了答案,该解析器无法正确解释 HTML5 中引入的元素,但作为一种解决方法,您可以使用更现代的解析器,例如
ConvertFrom-Html
(默认引擎是 AgilityPack)中使用的解析器。对于像所讨论的这样的简单 Html,您可以使用
XmlDocument
来解析它,然后在选择节点后,定位其父节点,然后RemoveChild()
。