让我们假设我有一个评估XPath表达式“// node / @ *”的结果。 MSXML6返回一组IXMLDOMNode对象,它们实际上是IXMLDOMAttribute对象。
问题:有没有办法删除只有一个代表属性的IXMLDOMNode对象的属性?
问题是MSXML只允许通过父节点删除子节点,但是属性没有它(parentNode返回NULL)。因此,在使用XPath提取后,我无法从节点分离属性。有办法吗?
感谢。
答案 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及以下。