《JavaScriptDOM编程艺术》一书中曾经用JS实现过MSXML不支持的insertAfter函数,刚才我用Perl在Windows平台实现这个函数:
use Win32::OLE qw(in with);use strict;
use constant MSXMLDOM => "MSXML2.DOMDOCUMENT.4.0";
sub insertAfter{ my($newElement, $targetElement) = @_; # my $lastChild = $parent->{lastChild};
# Next line can NOT work in Perl. # if($lastChild && $lastChild == $targetElement)
if (!$targetElement->nextSibling())
{ $parent->appendChild($newElement); } else { $parent->insertBefore($newElement,$targetElement->nextSibling()); }}
use Win32::OLE qw(in with);
use strict;
use constant MSXMLDOM => "MSXML2.DOMDOCUMENT.4.0";
sub insertAfter{
my($newElement, $targetElement) = @_;
# my $lastChild = $parent->{lastChild};
# Next line can NOT work in Perl.
# if($lastChild && $lastChild == $targetElement)
if (!$targetElement->nextSibling())
{
$parent->appendChild($newElement);
}
else
{
$parent->insertBefore($newElement,$targetElement->nextSibling());
}
}
Perl编译器:ActiverPerl 5.12
---------------------------------------------------------------------------------------------------------------------------------------
11/07/22 今天又用C++实现了一遍,代码如下:
bool CXmlUtil::InsertAfter(const XMLDOMNodePtr& nodeNew,const XMLDOMNodePtr& nodeTarget){if (!nodeNew || !nodeTarget){return false;}XMLDOMNodePtr nodeParent;HRESULT hr = nodeTarget->get_parentNode(&nodeParent);if (FAILED(hr) || nodeParent == NULL){return false;}XMLDOMNodePtr nodeSibling;hr = nodeTarget->get_nextSibling(&nodeSibling);ASSERT(SUCCEEDED(hr));if (nodeSibling){hr = nodeParent->insertBefore(nodeNew, _variant_t(nodeSibling.GetInterfacePtr()), NULL);ASSERT(SUCCEEDED(hr));}else{hr = nodeParent->appendChild(nodeNew, NULL);ASSERT(SUCCEEDED(hr));}return true;}
环境说明: MSXML4.0 + Visual Studio 2008
Last version: https://gist.github.com/1098668