现在的位置: 首页 > 综合 > 正文

用Perl实现XML DOM的insertAfter函数

2012年09月11日 ⁄ 综合 ⁄ 共 1345字 ⁄ 字号 评论关闭

《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

抱歉!评论已关闭.