|
《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());
}
}
Perl编译器:ActiverPerl 5.12
最新代码见:https://gist.github.com/1074492
---------------------------------------------------------------------------------------------------------------------------------------
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 |
|
|