shisgmei 发表于 2017-5-19 10:25:37

用Perl实现XML DOM的insertAfter函数

《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
页: [1]
查看完整版本: 用Perl实现XML DOM的insertAfter函数