如何删除节点的属性(MSXML)

时间:2012-04-04 04:27:03

标签: xml visual-studio-2010 xpath msxml

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

问题:有没有办法删除只有一个代表属性的IXMLDOMNode对象的属性?

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

感谢。

1 个答案:

答案 0 :(得分: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及以下。