1

假设我有一个评估 XPath 表达式“//node/@*”的结果。MSXML6 返回一组 IXMLDOMNode 对象,它们实际上是 IXMLDOMAttribute 对象。

问题:有没有办法删除只有一个代表属性的 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 回答