在将XML文件读入XmlDocument时如何忽略注释?

tun*_*nuz 24 .net c# xml comments

我试图用C#读取XML文档,我这样做:

XmlDocument myData = new XmlDocument();
myData.Load("datafile.xml");
Run Code Online (Sandbox Code Playgroud)

无论如何,我有时会在阅读XmlNode.ChildNodes时收到评论.

为了让谁遇到同样的要求,最后我就是这样做的:

/** Validate a file, return a XmlDocument, exclude comments */
private XmlDocument LoadAndValidate( String fileName )
{
    // Create XML reader settings
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.IgnoreComments = true;                         // Exclude comments
    settings.ProhibitDtd = false;                           
    settings.ValidationType = ValidationType.DTD;           // Validation

    // Create reader based on settings
    XmlReader reader = XmlReader.Create(fileName, settings);

    try {
        // Will throw exception if document is invalid
        XmlDocument document = new XmlDocument();
        document.Load(reader);
        return document;
    } catch (XmlSchemaException) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢
Tommaso

Mar*_*ers 40

您可以将XmlReaderwith XmlReaderSettings.IgnoreComments设置为true:

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreComments = true;
using (XmlReader reader = XmlReader.Create("input.xml", readerSettings))
{
    XmlDocument myData = new XmlDocument();
    myData.Load(reader);
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

(从发现这里通过搜索XmlDocument ignore comments)


And*_*dre 18

foreach(XmlNode node in nodeList)
  if(node.NodeType != XmlNodeType.Comment)
     ...
Run Code Online (Sandbox Code Playgroud)

  • 或者,为了便于阅读,将过滤器提升出循环:foreach(nodeList.Where中的XmlNode节点(node => node.NodeType!= XmlNodeType.Comment))... (3认同)

Red*_*dog 5

您只需在ChildNodes上添加过滤器即可.例如

var children = myNode.ChildNodes.Cast<XmlNode>().Where(n => n.NodeType != XmlNodeType.Comment);
Run Code Online (Sandbox Code Playgroud)

或者,您可以加载XmlDocument传递XmlReader,其设置使得XmlReaderSettings.IgnoreComments为true.

using (var file = File.OpenRead("datafile.xml"))
{
    var settings = new XmlReaderSettings() { IgnoreComments = true, IgnoreWhitespace = true };
    using (var xmlReader = XmlReader.Create(file, settings))
    {
        var document = new XmlDocument();
        document.Load(xmlReader);

        // Process document nodes...
    }
}
Run Code Online (Sandbox Code Playgroud)