如何在HtmlDocument中包装HtmlElement

时间:2014-12-16 11:04:21

标签: html .net powershell

是否可以使用另一个HtmlElement包装HtmlElement?如果是这样,怎么样?

让我们说,我有这个HTML,我想用img包裹div

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

我尝试使用以下代码段(n.b. document element is 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>

欢迎任何想法和提示!

1 个答案:

答案 0 :(得分:2)

您可以<img>节点替换 <div>节点,然后将(现在浮动)<img>节点添加到新添加的<div>。在代码中:

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

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

另外,$_.insertBefore($div, ...)获得的节点$_.previousSibling(...)可能更长。