Minha intenção era dar um conselho sobre a questão Delete everything between two strings (inclusive) para usar o analisador HTMLDocument em vez de um comando baseado em texto replace
.
Mas de alguma forma a OuterHTML
propriedade do <aside>
elemento não inclui o elemento em questão até a </aside>
tag final:
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>
'@
Análise
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>
- O que há de tão especial no
<aside>
elemento que explica a diferença para outros elementos como, por exemplo, a<div>
? - Qual é a maneira correta de incluir o
<aside>
elemento inteiro até a</aside>
tag final?
Acredito que a resposta já foi dada nos comentários de C3roe e Mathias , o analisador não é capaz de interpretar corretamente os elementos introduzidos no HTML5, mas como solução alternativa, você pode usar um analisador mais moderno, por exemplo, o usado em
ConvertFrom-Html
(o mecanismo padrão é o AgilityPack).Para um HTML simples como o em questão, você pode usar
XmlDocument
para analisá-lo e, depois de selecionar o nó, direcionar seu nó pai e entãoRemoveChild()
.