让我们假设我已经评估了XPath表达式“// node/@ *”的结果。 MSXML6返回一组实际为IXMLDOMAttribute对象的IXMLDOMNode对象。如何删除节点的属性(MSXML)
问:有没有办法删除那些只有表示属性的IXMLDOMNode对象的属性?
问题是,MSXML只允许通过父节点删除子节点,但属性没有它(parentNode返回NULL)。因此,在使用XPath提取后,我无法从节点分离属性。有没有办法解决?
谢谢。
让我们假设我已经评估了XPath表达式“// node/@ *”的结果。 MSXML6返回一组实际为IXMLDOMAttribute对象的IXMLDOMNode对象。如何删除节点的属性(MSXML)
问:有没有办法删除那些只有表示属性的IXMLDOMNode对象的属性?
问题是,MSXML只允许通过父节点删除子节点,但属性没有它(parentNode返回NULL)。因此,在使用XPath提取后,我无法从节点分离属性。有没有办法解决?
谢谢。
我认为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和下面的类。