2014-12-16 4 views
1

Возможно ли обернуть HtmlElement другим HtmlElement? И если да, то как?Как обернуть HtmlElement в HtmlDocument

Позволяет сказать, у меня есть этот HTML, и я хочу, чтобы обернуть img с дополнительным div:

<html> 
    <head><title>foo</title></head> 
    <body> 
    <img src="test.png"/> 
    <p>Hello World</p> 
    </body> 
</html> 

Я попытался использовать следующий фрагмент кода (пь элемент документа является HtmlDocument):

$htmlFile = New-Object -ComObject "HTMLFile" 
$htmlFile.IHtmlDocument2_write((gc -Path "./html.htm" -Raw)) 
$htmlFile.documentElement.getElementsByTagName("img") | %{ 
    $div = $htmlFile.createElement("div") 
    $div.className += "nonbreakingImage" 
    $void = $div.appendChild($_) 
    $_.OuterHtml = $div.OuterHtml 
} 

Но это, к сожалению, только удаляет тег изображения:

<BODY><P>Hello World</P></BODY> 

Другой идея был, чтобы сделать что-то вроде этого:

$htmlFile = New-Object -ComObject "HTMLFile" 
$htmlFile.IHtmlDocument2_write((gc -Path "./html.htm" -Raw)) 
$htmlFile.documentElement.getElementsByTagName("img") | %{ 
    $parent = $_.parentNode 
    $void = $parent.removeChild($_) 
    $div = $parent.appendChild($htmlFile.createElement("div")) 
    $div.className += " nonbreakingImage" 
    $void = $div.appendChild($_) 
} 

Но это оставляет меня с неправильным порядком ребенка:

<BODY> 
    <P>Hello World</P> 
    <DIV class=" nonbreakingImage"><IMG src="test.png"></DIV> 
</BODY> 

Любых идеи и советы приветствуются!

ответ

2

Вы можете заменить<img> узел с <div> узла затем добавить (теперь плавающая) <img> узел вновь добавленный <div>. В коде:

$htmlFile.documentElement.getElementsByTagName("img") | %{ 
    $div = $htmlFile.createElement("div") 
    $div.className += " nonbreakingImage" 

    $_.parentNode.replaceChild($div, $_) 
    $div.appendChild($_) 
} 

В Альтернативой может $_.insertBefore($div, ...) узла получается $_.previousSibling(...) но это дольше.