将 XML 文件读入 XmlDocument 时如何忽略注释? [复制]

Posted

技术标签:

【中文标题】将 XML 文件读入 XmlDocument 时如何忽略注释? [复制]【英文标题】:How to ignore comments when reading a XML file into a XmlDocument? [duplicate] 【发布时间】:2011-02-21 23:19:05 【问题描述】:

我正在尝试使用 C# 读取 XML 文档,我正在这样做:

XmlDocument myData = new XmlDocument();
myData.Load("datafile.xml");

不管怎样,我在阅读 XmlNode.ChildNodes 时有时会遇到 cmets。

为了让有相同需求的人受益,我最后是这样做的:

/** 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;
    

谢谢 托马索

【问题讨论】:

【参考方案1】:

如果您想使用 XmlDocument 而不是 XmlReader,最好按名称或使用 XPath 引用子节点。

那你就不用担心cmet已经添加了,或者其他节点,或者顺序有没有变化。

XmlDocument myData = new XmlDocument();
myData.Load("datafile.xml");

XmlNode DocNode = myData.DocumentElement;

XmlNode Child = DocNode ["SomeChildNode"];

这将选择根元素的子元素“SomeChildNode”。

下一个示例将遍历books.xml 中的所有书籍并打印作者。它使用字符串属性选择器和 Xpath。它应该不受 cmets 等的影响。

XmlDocument myData = new XmlDocument();
myData.Load("books.xml");

XmlNode DocNode = myData.DocumentElement;

XmlNodeList BookNodeList = DocNode.SelectNodes("./book");

foreach (XmlNode Book in BookNodeList)

    Console.WriteLine(Book["author"].InnerText);

注意,使用 XPath,您可以使用“.//book”之类的内容轻松搜索文档中的所有书籍元素。

books.xml:

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
<catalog>

参考资料:

XmlNode.Item 属性(字符串)hxxp://msdn.microsoft.com/en-us/library/sss31aas.aspx XmlNode.SelectNodes 方法(字符串)http://msdn.microsoft.com/en-us/library/hcebdtae.aspx XmlNode.SelectSingleNode 方法(字符串)http://msdn.microsoft.com/en-us/library/fb63z0tw.aspx

【讨论】:

【参考方案2】:
Dim pattern As String = String.Empty
Dim xDoc As XmlDocument = New XmlDocument()

xDoc.Load(path)

''Pattern of comments
pattern = "(<!--.*?--\>)"
xDoc.InnerXml = Regex.Replace(xDoc.InnerXml, pattern, String.Empty, RegexOptions.Singleline)

<!--aftr this run ur code-->

【讨论】:

【参考方案3】:

您可以使用 XmlReader 并将 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...

(通过搜索XmlDocument ignore comments从here找到)

【讨论】:

这不包括 cmets,但不包括 /* */ 它们也是有效的 XML cmets(使用 w3c 验证器检查)...【参考方案4】:

您可以简单地在您的 ChildNode 上添加过滤器。例如

var children = myNode.ChildNodes.Cast<XmlNode>().Where(n => n.NodeType != XmlNodeType.Comment);

或者,您可以加载传入 XmlReader 的 XmlDocument,其设置使 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...
    

【讨论】:

【参考方案5】:

使用XmlReaderSettings

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreComments = true;
XmlReader reader = XmlReader.Create(sourceFilePath, readerSettings);
XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.Load(reader);

【讨论】:

【参考方案6】:
foreach(XmlNode node in nodeList)
  if(node.NodeType != XmlNodeType.Comment)
     ...

【讨论】:

或者,为了可读性,将过滤器提升到循环之外:foreach(XmlNode node in nodeList.Where(node => node.NodeType != XmlNodeType.Comment)) ...

以上是关于将 XML 文件读入 XmlDocument 时如何忽略注释? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将带有“&”的 XML 读入 C# XMLDocument 对象

可扩展标记语言xml

如何将 XML 文件(XmlDocument)的内容写入文本文件?

XmlDocument 如何将新记录插入现有 XML 文件

将镶木地板文件读入数据框时如何为文件夹结构指定架构[重复]

c# 中,如何读取XML文件,并将读取到的内容显示到TreeView中