在C#中阅读XML注释

12

我有一些包含节点上方注释的XML文件。当我读入文件时,作为过程的一部分,我想将注释提取出来。我知道可以使用XmlComment写入注释到文件中,但不确定如何读回它们。

我的XML看起来类似于这样:

<Objects>
  <!--Comment about node-->
  <GUID-bf2401c0-ef5e-4d20-9d20-a2451a199362>
    <info job="SAVE" person="Joe" />    
    <info job="SAVE" person="Sally" />       
  </GUID-bf2401c0-ef5e-4d20-9d20-a2451a199362>
  <!--Another Comment about node-->
  <GUID-bf2401c0-ef5e-4d20-9d20-a5844113284112>
    <info job="SAVE" person="John" />    
    <info job="SAVE" person="Julie" />       
  </GUID-bf2401c0-ef5e-4d20-9d20-a5844113284112>


1
重要的遗漏细节:你用什么代码“读取文件”? - Tomalak
好的..你是如何阅读这个的 - V4Vendetta
请查看此答案 - marto
6个回答

17

试试这个:

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreComments = false; 
using (XmlReader reader = XmlReader.Create("input.xml", readerSettings))
{
    XmlDocument myData = new XmlDocument();
    myData.Load(reader);
    // etc...
}

阅读评论:

XmlReader xmlRdr = XmlReader.Create("Test.XML");
// Parse the file
while (xmlRdr.Read())
{
    switch (xmlRdr.NodeType)
    {
        case XmlNodeType.Element:
            // You may need to capture the last element to provide a context
            // for any comments you come across... so copy xmlRdr.Name, etc.
            break;
        case XmlNodeType.Comment:
            // Do something with xmlRdr.value

2
IgnoreComments 的默认值为 false - V4Vendetta
2
@V4vend:即便如此,在这个答案和实际代码中,明确设置它仍然是一个好主意。 - H H
运行得很好,我从未意识到节点有那样的类型。 - beakersoft
如果注释放置在根元素之外,例如<Objects>,它能被读取和解析吗? - mko

14

使用System.Xml.Linq库:

var doc = XElement.Load(fileName);
var comments = doc.DescendantNodes().OfType<XComment>();

foreach (XComment comment in comments)
   ...

3

2

虽然这个问题很老了,但昨天我也遇到了同样的问题。所以这是我的解决方案:

XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = false;
settings.IgnoreComments = false;
XmlReaderSettings settings2 = new XmlReaderSettings();
settings2.IgnoreWhitespace = false;
settings2.IgnoreComments = false;
XmlReader xmlreaderOriginalCfg = XmlReader.Create(@"C:\...xml", settings);
XmlReader xmlreaderVerificationCfg = XmlReader.Create(@"C:\....xml", settings);

XmlDocument myData = new XmlDocument();
myData.Load(xmlreaderOriginalCfg);
XmlDocument myData2 = new XmlDocument();
myData2.Load(xmlreaderVerificationCfg);

XmlNode parentNode = myData.SelectSingleNode("/configuration/appSettings");

foreach (XmlComment comment in myData2.SelectNodes("//comment()"))
{
     XmlComment importedCom = myData.CreateComment(comment.Value);
     parentNode.AppendChild(importedCom);

     foreach (XmlNode node in myData2.DocumentElement.SelectNodes("/configuration/appSettings/add"))
     {
          XmlNode imported = myData.ImportNode(node, true);
          parentNode.AppendChild(imported);
     }
}
myData.Save(this.pathNew);

也许能帮到某些人。

0

我将你的XML存储到了一个文件中,这是示例代码。

        XmlDocument document = new XmlDocument();
        document.Load("test.xml");
        foreach (XmlComment comment in document.SelectNodes("//comment()"))
        {
            Console.WriteLine("Comment: \"{0}\".", comment.Value);
        }

0

以下是一些访问注释的示例代码,希望对您有所帮助

using System;
using System.IO;
using System.Xml;

public class Sample {

  public static void Main() {

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(@"<Objects><!--Comment about node--><othernode/><!--Some more comment--></Objects>");

    XmlNode root = doc.FirstChild;
    if (root.HasChildNodes)
    {
      for (int i=0; i<root.ChildNodes.Count; i++)
      {
        if(     root.ChildNodes[i] is XmlComment)
            Console.WriteLine(root.ChildNodes[i].InnerText);
      }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接