2009-12-09 10 views
17

Jak usunąć wszystkie tagi komentarzy z instancji XmlDocument?Jak usunąć wszystkie tagi komentarzy z XmlDocument

Czy istnieje lepszy sposób niż pobieranie XmlNodeList i iteracyjne nad nimi?


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

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

Wydaje mi się to dobre. – Dave

Odpowiedz

28

Podczas ładowania XML, można użyć XmlReaderSettings

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

na istniejącym przykład rozwiązanie wygląda dobrze.

4

To nie wszystko, chociaż powinienem najpierw umieścić węzły na liście.

Nie jestem pewien co do implementacji .NET z XmlNodeList, ale wiem, że poprzednie implementacje MSXML ładowały listę w leniwy sposób, a kod taki jak powyższy w przeszłości kończyłby się w jakiś sposób niepowodzeniem w wyniku DOM drzewo jest modyfikowane w miarę wyliczania listy.

foreach (var node in xml.SelectNodes("//comment()").ToList()) 
    node.ParentNode.RemoveChild(node); 
0

Dziś szuka sposobu jak wydobyć <!-- --> z Visual Basic for Applications (nie C#), znalazłem też nodeTypeString własność, ale to zajmuje więcej miejsca. Oto przykład w 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 

To omitts udokumentować najlepszymi nadrzędne komentarz węzły, ale mogą być pobierane bezpośrednio jakoś w razie potrzeby, na przykład za pomocą With xmldoc.documentElement.childNodes.

Powiązane problemy