Как удалить все теги комментариев из XmlDocument
Как я могу удалить все теги комментариев из экземпляра XmlDocument?
Есть ли лучший способ, чем получить XmlNodeList и перебрать их?
XmlNodeList list = xmlDoc.SelectNodes("//comment()");
foreach(XmlNode node in list)
{
node.ParentNode.RemoveChild(node);
}
Ответы
Ответ 1
Когда вы загружаете xml, вы можете использовать XmlReaderSettings
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
XmlReader reader = XmlReader.Create("...", settings);
xmlDoc.Load(reader);
В существующем экземпляре ваше решение выглядит хорошо.
Ответ 2
Не об этом, хотя я бы хотел вначале поместить узлы в список.
Я не уверен в .NET-реализации XmlNodeList
, но я знаю, что предыдущие реализации MSXML загружали список ленивым образом, а код, такой как выше в прошлом, в конечном итоге потерпел бы неудачу в результате Дерево DOM, модифицируемое как список, перечисляется.
foreach (var node in xml.SelectNodes("//comment()").ToList())
node.ParentNode.RemoveChild(node);
Ответ 3
Сегодня, ища способ извлечь <!-- -->
из Visual Basic для приложений (а не С#), я также нашел свойство 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
.