《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
---------------------------------------------------------------------------------------------------------------------------------------
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