Как удалить все теги комментариев из XmlDocument

Как мне удалить все теги комментариев из экземпляра XmlDocument?

Есть ли лучший способ, чем получить XmlNodeList и перебрать его?


    XmlNodeList list = xmlDoc.SelectNodes("//comment()");

    foreach(XmlNode node in list)
    {
        node.ParentNode.RemoveChild(node);
    }

person Filburt    schedule 09.12.2009    source источник


Ответы (3)


Когда вы загружаете xml, вы можете использовать XmlReaderSettings

XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
XmlReader reader = XmlReader.Create("...", settings);
xmlDoc.Load(reader);

На существующем экземпляре ваше решение выглядит хорошо.

person Guillaume    schedule 09.12.2009

Нет, вот и все, хотя я был бы склонен сначала поместить узлы в список.

Я не уверен насчет реализации XmlNodeList в .NET, но я знаю, что предыдущие реализации MSXML загружали список ленивым образом, и код, подобный приведенному выше в прошлом, в конечном итоге каким-то образом не сработал в результате изменения дерева DOM как Список пронумерован.

 foreach (var node in xml.SelectNodes("//comment()").ToList())
   node.ParentNode.RemoveChild(node);
person AnthonyWJones    schedule 09.12.2009

Сегодня, ища способ извлечь <!-- --> из Visual Basic для приложений (не C #), я обнаружил также свойство nodeTypeString, но оно занимает больше места. Вот пример на VBA:

Dim xmldoc As New MSXML2.DOMDocument30
Dim oNodeList As IXMLDOMSelection
Dim node As IXMLDOMNode
Dim i As Long

Dim FileName As String, FileName1 As String

FileName = "..." ' Source
FileName2 = "..." ' Target

xmldoc.async = False ' ?
xmldoc.Load FileName
If (xmldoc.parseError.errorCode <> 0) Then Exit Sub ' or Function

Set oNodeList = xmldoc.selectNodes("//*") '' all nodes

For i = 0 To oNodeList.length - 1
With oNodeList(i)

     For Each node In .childNodes
         If node.nodeTypeString = "comment" Then .removeChild node
     Next

End With
Next

xmldoc.Save FileName2

Set oNodeList = Nothing ' ?
Set xmldoc = Nothing

Он опускает верхние родительские узлы комментариев документа, но при необходимости их можно как-то получить напрямую, например, используя With xmldoc.documentElement.childNodes.

person darekk    schedule 08.04.2013