2012-04-04 1 views
1

Давайте представим, что у меня есть результат вычисления выражения XPath «// node/@ *». MSXML6 возвращает набор объектов IXMLDOMNode, которые фактически являются объектом IXMLDOMAttribute.Как удалить атрибуты узла (MSXML)

Вопрос: Есть ли способ удалить эти атрибуты, имеющие только объект IXMLDOMNode, который представляет атрибут?

Проблема заключается в том, что MSXML позволяет удалять дочерние узлы только через родительский узел, но атрибут не имеет его (parentNode возвращает NULL). Следовательно, я не могу отделить атрибут от узла после его извлечения с помощью XPath. Есть ли способ?

Спасибо.

ответ

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 предназначен для собственного кода, если вы пишете управляемый код .NET с C# или VB.NET, тогда вы должны использовать классов в пространстве имен System.Xml и ниже.