1

XPath 式 "//node/@*" を評価した結果があるとします。MSXML6 は、実際には IXMLDOMAttribute オブジェクトである IXMLDOMNode オブジェクトのセットを返します。

質問: 属性を表す IXMLDOMNode オブジェクトのみを持つ属性を削除する方法はありますか?

問題は、MSXML では親ノードを介してのみ子ノードを削除できるが、属性にはそれがない (parentNode が NULL を返す) ことです。したがって、XPath を使用して抽出した後、ノードから属性を切り離すことはできません。回避策はありますか?

ありがとう。

4

1 に答える 1

3

W3C DOM は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 以下。

于 2012-04-04T09:03:47.803 に答える