2012-04-04 109 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和下面的類。