none
【C#】C#如何为XML中的某一节点添加注释呢? RRS feed

  • 问题

  • 想问下,我想利用C#为XML文件中已经存在的某一个节点添加注释,请问有什么好的方法吗?


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com


    2012年7月4日 6:22

答案

  • 参考:

    static void Main(string[] args)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
                //Find the node
                XmlNode node = doc.SelectSingleNode("//br");
                //Do Insert the comment before
                XmlComment comment = doc.CreateComment("this is a sample thing");
                node.ParentNode.InsertBefore(comment, node);
                doc.Save("c:\\try.xml");
            }

    [The original xml file is]

    <root>
      <a>This is a sample</a>
      <br>aaa</br>
    </root>

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月4日 8:12
    版主
  • 你好添加注释已经解决,代码如下:

            XmlDocument doc = new XmlDocument();
            doc.Load(Server.MapPath("~/xml/test.xml"));
            XmlNode rootElement = doc.SelectSingleNode("//root");
            XmlNodeList xnl = doc.SelectSingleNode("//root").ChildNodes;

            for (int i = 0; i < xnl.Count; i++)
            {
                XmlNode xe = xnl.Item(i);
                if (((XmlElement)xe).GetAttribute("name") == "1")
                {
                    XmlDocumentFragment inxml = doc.CreateDocumentFragment();
                    inxml.InnerText = "<!--";
                    xe.ParentNode.InsertBefore(inxml, xe);
                    inxml.InnerText = "-->";
                    xe.ParentNode.InsertAfter(inxml, xe);
                    break;


                }
            }

    感谢你的帮助!


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    • 已标记为答案 jinwb1982 2012年7月6日 9:16
    2012年7月6日 9:16
  • 我不明白——你既然不需要标记,为什么还要注释呢?你不是废话吗?一开始不要注释就好了。

    参考:

    1. public class MainTest
    2.    {
    3.        static void Main(string[] args)
    4.        {
    5.            XmlDocument doc = new XmlDocument();
    6.            doc.Load("XMLFile1.xml");
    7.            //读取注释的内容
    8.            string s = doc.DocumentElement.FirstChild.InnerText;
    9.            //解析其xml内容
    10.            XmlDocument tdoc = new XmlDocument();
    11.            tdoc.LoadXml(s);
    12.            //删除原来的内容
    13.            doc.DocumentElement.RemoveChild(doc.DocumentElement.FirstChild);
    14.            //重新添加
    15.           XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null);
    16.           ele.InnerText = tdoc.InnerText;
    17.           doc.DocumentElement.AppendChild(ele);
    18.           doc.Save("c:\\try.xml");
    19.        }
    20.    }

    【原来的xml】

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <Root>
    3.   <!--<a>This is a sample</a>-->
    4. </Root>

    顺便说一声:一个帖子不要问那么多问题,请尊重别人的回答,把我的上面全部回答的答案给标记了,因为你没有问清楚!!!


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月8日 4:25
    版主
  • 我不明白——你既然不需要标记,为什么还要注释呢?你不是废话吗?一开始不要注释就好了。

    参考:

    1. public class MainTest
    2.    {
    3.        static void Main(string[] args)
    4.        {
    5.            XmlDocument doc = new XmlDocument();
    6.            doc.Load("XMLFile1.xml");
    7.            //读取注释的内容
    8.            string s = doc.DocumentElement.FirstChild.InnerText;
    9.            //解析其xml内容
    10.            XmlDocument tdoc = new XmlDocument();
    11.            tdoc.LoadXml(s);
    12.            //删除原来的内容
    13.            doc.DocumentElement.RemoveChild(doc.DocumentElement.FirstChild);
    14.            //重新添加
    15.           XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null);
    16.           ele.InnerText = tdoc.InnerText;
    17.           doc.DocumentElement.AppendChild(ele);
    18.           doc.Save("c:\\try.xml");
    19.        }
    20.    }

    【原来的xml】

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <Root>
    3.   <!--<a>This is a sample</a>-->
    4. </Root>

    顺便说一声:一个帖子不要问那么多问题,请尊重别人的回答,把我的上面全部回答的答案给标记了,因为你没有问清楚!!!


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    你好,研究了一下午。终于解决了。感谢你的帮助。代码如下:

            XmlDocument doc = new XmlDocument();
            doc.Load(Server.MapPath("~/xml/test.xml"));
            string allxml = doc.OuterXml;//xe.OuterXml;
          
            XmlTextReader reader = new XmlTextReader(Server.MapPath("~/xml/test.xml"));
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Comment) //注释内容
                {
                    
                    string vv = reader.Value;//<a name=\"1\">This is a sample</a>
                    //xmlDoc = new XmlDocument();
                    doc.LoadXml(vv); //装载xml
                    XmlNode xNode = doc.SelectSingleNode("//a");
                    string strValue = xNode.Attributes[0].Value;
                    if (strValue == "1") //若与数据库数值相同
                    {
                        string repstr = "<!--" + vv + "-->";
                        allxml = allxml.Replace(repstr, vv);
                    }
                    doc.LoadXml(allxml);
                    doc.Save("c:\\try.xml");
                    break;
                }
            }


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    2012年7月8日 12:32

全部回复

  • 参考:

    static void Main(string[] args)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
                //Find the node
                XmlNode node = doc.SelectSingleNode("//br");
                //Do Insert the comment before
                XmlComment comment = doc.CreateComment("this is a sample thing");
                node.ParentNode.InsertBefore(comment, node);
                doc.Save("c:\\try.xml");
            }

    [The original xml file is]

    <root>
      <a>This is a sample</a>
      <br>aaa</br>
    </root>

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月4日 8:12
    版主
  • 参考:

    static void Main(string[] args)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
                //Find the node
                XmlNode node = doc.SelectSingleNode("//br");
                //Do Insert the comment before
                XmlComment comment = doc.CreateComment("this is a sample thing");
                node.ParentNode.InsertBefore(comment, node);
                doc.Save("c:\\try.xml");
            }

    [The original xml file is]

    <root>
      <a>This is a sample</a>
      <br>aaa</br>
    </root>

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    你好,感谢你的帮助,但是有一个问题,就是只在前面添加了"<!--" 那么该节点的后面难道利用InsertAfter添加吗?我的这个问题使用的是循环遍历节点,如果查出数据的话,我发现插入的数据是譬如<!--  这样的形式,程序会误认为是节点,那么在循环中就造成了不准确。这样如何解决呢?

    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com


    2012年7月4日 8:41
  • >>如果查出数据的话,我发现插入的数据是譬如<!-- 这样的形式,程序会误认为是节点,那么在循环中就造成了不准确。这样如何解决呢?

    应该不会吧?这是注释,会被自动忽略的;好比说你用C#写代码,编译的时候编译器是忽略的。XD

    我再给你一个例子:

    InsertBefore(要插入的节点,原有的节点);  //在原有节点处插入节点

    假设你的Xml文件:

    <root>
      <a>This is a sample</a>
      <b>aaa</b>
      <c>This is a sample</c>
      <d>aaa</d>
    </root>

    我循环插入,请看好:

    public class MainTest
        {
            static void Main(string[] args)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
                //Find the node
                foreach (XmlNode item in doc.DocumentElement.ChildNodes)
                {
                    XmlComment comNode = doc.CreateComment("This is a "+item.InnerText);
                    doc.DocumentElement.InsertBefore(comNode, item);
                }
                doc.Save("C:\\try.xml");
                //重新遍历输出节点内容
                doc.Load("C:\\try.xml");
                foreach (XmlNode item in doc.DocumentElement.ChildNodes)
                {
                    if (item.NodeType == XmlNodeType.Element)
                    {
                        Console.WriteLine(item.InnerText);
                    }
                }
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月4日 9:13
    版主
  • >>如果查出数据的话,我发现插入的数据是譬如<!-- 这样的形式,程序会误认为是节点,那么在循环中就造成了不准确。这样如何解决呢?

    应该不会吧?这是注释,会被自动忽略的;好比说你用C#写代码,编译的时候编译器是忽略的。XD

    我再给你一个例子:

    InsertBefore(要插入的节点,原有的节点);  //在原有节点处插入节点

    假设你的Xml文件:

    <root>
      <a>This is a sample</a>
      <b>aaa</b>
      <c>This is a sample</c>
      <d>aaa</d>
    </root>

    我循环插入,请看好:

    public class MainTest
        {
            static void Main(string[] args)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
                //Find the node
                foreach (XmlNode item in doc.DocumentElement.ChildNodes)
                {
                    XmlComment comNode = doc.CreateComment("This is a "+item.InnerText);
                    doc.DocumentElement.InsertBefore(comNode, item);
                }
                doc.Save("C:\\try.xml");
                //重新遍历输出节点内容
                doc.Load("C:\\try.xml");
                foreach (XmlNode item in doc.DocumentElement.ChildNodes)
                {
                    if (item.NodeType == XmlNodeType.Element)
                    {
                        Console.WriteLine(item.InnerText);
                    }
                }
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    你好,结合你的实例我做了一个试验,其中发现了一个问题。如果在节点后面加入注释的话会出现System.OutOfMemoryException异常。请问你也是这样的吗?我的XP系统32位的,内存2GB,更奇怪的是在前面加就没有问题,这是什么原因呢?请指教,谢谢!

    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com


    2012年7月6日 4:30
  • 确实很奇怪,不是很清楚原因,不过这个方法可行:

        public class MainTest
        {
            static void Main(string[] args)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
                //Find the node
                for (int i = 0; i < doc.DocumentElement.ChildNodes.Count; i++)
                {
                    if (doc.DocumentElement.ChildNodes[i].NodeType == XmlNodeType.Element)
                    {
                        doc.DocumentElement.InsertAfter(doc.CreateComment("See this!"), doc.DocumentElement.ChildNodes[i]);
                    }
                }
                doc.Save("c:\\try.xml");
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月6日 5:07
    版主
  • 确实很奇怪,不是很清楚原因,不过这个方法可行:

        public class MainTest
        {
            static void Main(string[] args)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
                //Find the node
                for (int i = 0; i < doc.DocumentElement.ChildNodes.Count; i++)
                {
                    if (doc.DocumentElement.ChildNodes[i].NodeType == XmlNodeType.Element)
                    {
                        doc.DocumentElement.InsertAfter(doc.CreateComment("See this!"), doc.DocumentElement.ChildNodes[i]);
                    }
                }
                doc.Save("c:\\try.xml");
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    你好!如果是某一个节点前后都插入呢?其实我的意思是想注释掉一个节点  比如:<!--<d>aaa</d>-->  结合你给的例子,把这个d节点注释掉

    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    • 已标记为答案 jinwb1982 2012年7月6日 8:15
    • 取消答案标记 jinwb1982 2012年7月6日 8:15
    2012年7月6日 5:18
  • 请先标记答案再说,你没有把问题说清楚,一个帖子原则上一个问题


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月6日 7:42
    版主
  • namespace CSharp
    {
        public class MainTest
        {
            static void Main(string[] args)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
                for (int i = 0; i < doc.DocumentElement.ChildNodes.Count; i++)
                {
                    if (doc.DocumentElement.ChildNodes[i].NodeType == XmlNodeType.Comment)
                    {
                        //转化成标准的xml
                        string value = doc.DocumentElement.ChildNodes[i].InnerText;
                        //解析为xml
                        XmlDocument tdoc = new XmlDocument();
                        tdoc.LoadXml(value);
                        doc.DocumentElement.RemoveChild(doc.DocumentElement.ChildNodes[i]);
                        //转化为xml节点插入
                        XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null);
                        ele.InnerText = tdoc.DocumentElement.InnerText;
                        doc.DocumentElement.AppendChild(ele);
                        i--;
                    }
                }
                doc.Save("c:\\try.xml");
            }
        }
    }

    假设你的xml:

    <root>
      <!--<b>This is a sample</b> -->
    </root>

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月6日 7:53
    版主
  • namespace CSharp
    {
        public class MainTest
        {
            static void Main(string[] args)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
                for (int i = 0; i < doc.DocumentElement.ChildNodes.Count; i++)
                {
                    if (doc.DocumentElement.ChildNodes[i].NodeType == XmlNodeType.Comment)
                    {
                        //转化成标准的xml
                        string value = doc.DocumentElement.ChildNodes[i].InnerText;
                        //解析为xml
                        XmlDocument tdoc = new XmlDocument();
                        tdoc.LoadXml(value);
                        doc.DocumentElement.RemoveChild(doc.DocumentElement.ChildNodes[i]);
                        //转化为xml节点插入
                        XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null);
                        ele.InnerText = tdoc.DocumentElement.InnerText;
                        doc.DocumentElement.AppendChild(ele);
                        i--;
                    }
                }
                doc.Save("c:\\try.xml");
            }
        }
    }

    假设你的xml:

    <root>
      <!--<b>This is a sample</b> -->
    </root>

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    你好,经过测试发现还是有问题的,提示错误根级别上的数据无效。  问题是出在tdoc.LoadXml(value); 这个程序我看了一下,之前如果有<!--  -->这样的测试好说,如果没有注释,某节点添加注释呢?

    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    2012年7月6日 8:34
  • 对不起,我现在不清楚你到底要问什么?你的问题我都回答了,你一会儿说如何添加节点,一会儿又要把注释的节点变成普通节点(删除注释)?

    请给出你的xml,告诉我你要的结果!


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月6日 8:37
    版主
  • >>如果没有注释,某节点添加注释呢?

    这个问题就是添加节点,请不要和“删除注释节点”混淆!请仔细看我上文的内容,自己动脑子想想。:D


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月6日 8:39
    版主
  • >>如果没有注释,某节点添加注释呢?

    这个问题就是添加节点,请不要和“删除注释节点”混淆!请仔细看我上文的内容,自己动脑子想想。:D


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    不好意思,可能是我表达不清楚,其实就是想把XML文件如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <root>
      <a >This is a sample</a>
      <b>aaa</b>
      <c>This is a sample</c>
      <d>aaa</d>
    </root>

    把 <a >This is a sample</a> 注释掉就可以了


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    2012年7月6日 8:54
  • 你好添加注释已经解决,代码如下:

            XmlDocument doc = new XmlDocument();
            doc.Load(Server.MapPath("~/xml/test.xml"));
            XmlNode rootElement = doc.SelectSingleNode("//root");
            XmlNodeList xnl = doc.SelectSingleNode("//root").ChildNodes;

            for (int i = 0; i < xnl.Count; i++)
            {
                XmlNode xe = xnl.Item(i);
                if (((XmlElement)xe).GetAttribute("name") == "1")
                {
                    XmlDocumentFragment inxml = doc.CreateDocumentFragment();
                    inxml.InnerText = "<!--";
                    xe.ParentNode.InsertBefore(inxml, xe);
                    inxml.InnerText = "-->";
                    xe.ParentNode.InsertAfter(inxml, xe);
                    break;


                }
            }

    感谢你的帮助!


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    • 已标记为答案 jinwb1982 2012年7月6日 9:16
    2012年7月6日 9:16
  • 哦,那你应该说——把一个xml节点注释掉。

    那么:

     public class MainTest
        {
            static void Main(string[] args)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
                //保留第一个节点内容
                string value = doc.DocumentElement.FirstChild.OuterXml;
                //删除第一个节点
                doc.DocumentElement.RemoveChild(doc.DocumentElement.FirstChild);
                //重新添加
                XmlComment com = doc.CreateComment(value);
                doc.DocumentElement.InsertBefore(com, doc.DocumentElement.FirstChild);
                doc.Save("c:\\try.xml");
            }
        }
    希望下次一次性说清问题就好咯……不然你就直接上代码和你的意图,我看看你要干啥?谢谢!

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月6日 9:17
    版主
  • 好的好的,谢谢了!能引申一个问题吗?结合你的例子,如果注释以后,如何才能删除呢?

    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    2012年7月6日 9:44
  • 好的好的,谢谢了!能引申一个问题吗?结合你的例子,如果注释以后,如何才能删除呢?

    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    请给出你的xml代码以及标记出来你要删除什么,谢谢。你的话我实在不懂。


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月7日 5:10
    版主
  • 好的好的,谢谢了!能引申一个问题吗?结合你的例子,如果注释以后,如何才能删除呢?


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    请给出你的xml代码以及标记出来你要删除什么,谢谢。你的话我实在不懂。


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    比如已经标记成<!--<a >This is a sample</a> -->  如何去掉<!-- --> 呢?

    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    2012年7月8日 3:21
  • 我不明白——你既然不需要标记,为什么还要注释呢?你不是废话吗?一开始不要注释就好了。

    参考:

    1. public class MainTest
    2.    {
    3.        static void Main(string[] args)
    4.        {
    5.            XmlDocument doc = new XmlDocument();
    6.            doc.Load("XMLFile1.xml");
    7.            //读取注释的内容
    8.            string s = doc.DocumentElement.FirstChild.InnerText;
    9.            //解析其xml内容
    10.            XmlDocument tdoc = new XmlDocument();
    11.            tdoc.LoadXml(s);
    12.            //删除原来的内容
    13.            doc.DocumentElement.RemoveChild(doc.DocumentElement.FirstChild);
    14.            //重新添加
    15.           XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null);
    16.           ele.InnerText = tdoc.InnerText;
    17.           doc.DocumentElement.AppendChild(ele);
    18.           doc.Save("c:\\try.xml");
    19.        }
    20.    }

    【原来的xml】

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <Root>
    3.   <!--<a>This is a sample</a>-->
    4. </Root>

    顺便说一声:一个帖子不要问那么多问题,请尊重别人的回答,把我的上面全部回答的答案给标记了,因为你没有问清楚!!!


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月8日 4:25
    版主
  • 我不明白——你既然不需要标记,为什么还要注释呢?你不是废话吗?一开始不要注释就好了。

    参考:

    1. public class MainTest
    2.    {
    3.        static void Main(string[] args)
    4.        {
    5.            XmlDocument doc = new XmlDocument();
    6.            doc.Load("XMLFile1.xml");
    7.            //读取注释的内容
    8.            string s = doc.DocumentElement.FirstChild.InnerText;
    9.            //解析其xml内容
    10.            XmlDocument tdoc = new XmlDocument();
    11.            tdoc.LoadXml(s);
    12.            //删除原来的内容
    13.            doc.DocumentElement.RemoveChild(doc.DocumentElement.FirstChild);
    14.            //重新添加
    15.           XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null);
    16.           ele.InnerText = tdoc.InnerText;
    17.           doc.DocumentElement.AppendChild(ele);
    18.           doc.Save("c:\\try.xml");
    19.        }
    20.    }

    【原来的xml】

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <Root>
    3.   <!--<a>This is a sample</a>-->
    4. </Root>

    顺便说一声:一个帖子不要问那么多问题,请尊重别人的回答,把我的上面全部回答的答案给标记了,因为你没有问清楚!!!


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    你好,研究了一下午。终于解决了。感谢你的帮助。代码如下:

            XmlDocument doc = new XmlDocument();
            doc.Load(Server.MapPath("~/xml/test.xml"));
            string allxml = doc.OuterXml;//xe.OuterXml;
          
            XmlTextReader reader = new XmlTextReader(Server.MapPath("~/xml/test.xml"));
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Comment) //注释内容
                {
                    
                    string vv = reader.Value;//<a name=\"1\">This is a sample</a>
                    //xmlDoc = new XmlDocument();
                    doc.LoadXml(vv); //装载xml
                    XmlNode xNode = doc.SelectSingleNode("//a");
                    string strValue = xNode.Attributes[0].Value;
                    if (strValue == "1") //若与数据库数值相同
                    {
                        string repstr = "<!--" + vv + "-->";
                        allxml = allxml.Replace(repstr, vv);
                    }
                    doc.LoadXml(allxml);
                    doc.Save("c:\\try.xml");
                    break;
                }
            }


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    2012年7月8日 12:32
  • 2012年7月9日 1:32
    版主