2012-04-04 106 views
1

让我们假设我已经评估了XPath表达式“// node/@ *”的结果。 MSXML6返回一组实际为IXMLDOMAttribute对象的IXMLDOMNode对象。如何删除节点的属性(MSXML)

问:有没有办法删除那些只有表示属性的IXMLDOMNode对象的属性?

问题是,MSXML只允许通过父节点删除子节点,但属性没有它(parentNode返回NULL)。因此,在使用XPath提取后,我无法从节点分离属性。有没有办法解决?

谢谢。

回答

3

我认为W3C DOM引入了property ownerElement,但MSXML从未尝试追赶W3C DOM。所以我能想到的最好的是XPath和selectSingleNode来查找父元素。下面是使用JScript和MSXML 6做了一个例子:

var doc = new ActiveXObject("Msxml2.DOMDocument.6.0"); 
if (doc.loadXML([ 
    '<root>', 
    ' <foo att="1"/>', 
    ' <bar att="2"/>', 
    '</root>' 
].join('\r\n'))) 
{ 
    var attributes = doc.selectNodes('//@att'); 
    for (var i = attributes.length - 1; i >= 0; i--) 
    { 

    attributes[i].selectSingleNode('..').removeAttributeNode(attributes[i]); 
    } 
    WScript.Echo(doc.xml); 
} 
else 
{ 
    WScript.Echo(doc.xml); 
} 

输出则是

<root> 
     <foo/> 
     <bar/> 
</root> 

这样的方式工作。我意识到你不使用JScript,而是可能是C++,你需要添加强制转换以获得正确的接口,从而暴露像removeAttributeNode这样的方法,但上面的内容应该足以概述方法。作为最后一个注意事项,因为您没有提及任何编程语言或环境,但仅使用VS 2010,MSXML仅适用于本机代码,如果您使用C#或VB.NET编写托管.NET代码,则应使用命名空间System.Xml和下面的类。