2012-04-04 14 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はネイティブコード用です。管理された.NETコードをC#またはVB.NETで記述する場合は、名前空間System.Xml以下のクラス

関連する問題