XmlDocumentインスタンスからすべてのコメントタグを削除するにはどうすればよいですか?
XmlNodeListを取得してそれらを反復処理するよりも良い方法はありますか?
XmlNodeList list = xmlDoc.SelectNodes("//comment()");
foreach(XmlNode node in list)
{
node.ParentNode.RemoveChild(node);
}
XmlDocumentインスタンスからすべてのコメントタグを削除するにはどうすればよいですか?
XmlNodeListを取得してそれらを反復処理するよりも良い方法はありますか?
XmlNodeList list = xmlDoc.SelectNodes("//comment()");
foreach(XmlNode node in list)
{
node.ParentNode.RemoveChild(node);
}
xmlをロードするときに、 XmlReaderSettingsを使用できます
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
XmlReader reader = XmlReader.Create("...", settings);
xmlDoc.Load(reader);
既存のインスタンスでは、ソリューションは適切に見えます。
いいえ、それについてはそれではありませんが、最初にノードをリストに配置することをお勧めします。
の.NET実装についてはXmlNodeList
よくわかりませんが、以前のMSXML実装が怠惰な方法でリストをロードし、過去の上記のようなコードは、DOMツリーが次のように変更された結果として何らかの方法で失敗することになることを知っています。リストが列挙されます。
foreach (var node in xml.SelectNodes("//comment()").ToList())
node.ParentNode.RemoveChild(node);
<!-- -->
今日、Visual Basic for Applications(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
。