RAD Studio中如何避免XML注释被解析为节点?
在RAD Studio 10.2.3和11.3中避免XML注释被视为有效节点的方法
你遇到的问题是TXmlDocument默认会将XML注释解析为节点,导致统计子节点时包含注释。以下两种方法可以解决这个问题:
方法1:加载时配置DOM忽略注释
Windows平台下TXmlDocument默认使用MSXML解析器,可通过设置DOM对象的preserveComments属性为False,让解析器加载时直接忽略注释节点:
XmlDoc := TXmlDocument.Create(nil); try // 先创建并配置MSXML DOM对象 var DOM: IXMLDOMDocument2; DOM := CoDOMDocument60.Create; DOM.preserveComments := False; // 禁用注释保留 XmlDoc.DOMDocument := DOM; XmlDoc.LoadFromFile('C:\test.xml'); msgNode := XMLDoc.ChildNodes.FindNode('Message'); NofChildren := 0; for i := 0 to msgNode.ChildNodes.Count-1 do begin Inc(NofChildren); tmpNode := msgNode.ChildNodes[i]; end; // 此时NofChildren会是1,仅统计<id>节点 finally XmlDoc.Free; end;
注意:该方法仅适用于Windows平台的MSXML解析器,跨平台项目不推荐使用。
方法2:遍历节点时过滤注释类型
不管使用哪种解析器(Windows/MSXML、跨平台/LibXML2),都可以通过判断节点类型跳过注释节点。XML注释对应的节点类型是ntComment:
XmlDoc := TXmlDocument.Create(nil); try XmlDoc.LoadFromFile('C:\test.xml'); msgNode := XMLDoc.ChildNodes.FindNode('Message'); NofChildren := 0; for i := 0 to msgNode.ChildNodes.Count-1 do begin tmpNode := msgNode.ChildNodes[i]; // 仅统计非注释类型的节点 if tmpNode.NodeType <> ntComment then begin Inc(NofChildren); end; end; // 此时NofChildren会是1,注释节点被跳过 finally XmlDoc.Free; end;
这种方法通用性更强,适合所有平台的RAD Studio项目。
内容的提问来源于stack exchange,提问作者user729103
相关产品推荐
相关产品推荐

