Xml解析之排除注释

总结:

1、Xml中的注释也被当作节点元素;

示例XMLFile1.xml:

<?xml version="1.0" encoding="utf-8" ?>
<News>
  <!--{标题注释}-->
  <NewsTitle>{标题1}</NewsTitle>
  <NewsList>
    <!--{标题列表注释}-->
    <NewsDetailTitle>{详细标题1}</NewsDetailTitle>
    <NewsDetailName>{详细名称}</NewsDetailName>
  </NewsList>

</News>

C#解析代码:

 private void button1_Click(object sender, EventArgs e)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("XMLFile1.xml");
            // 根节点
            XmlNode node = doc.DocumentElement; 
            // 遍历根节点的子节点
            foreach (XmlNode childNode in node.ChildNodes)
            {
                // 【注意1:把根节点中的注释当成子节点】

                //if (childNode.NodeType != XmlNodeType.Comment) // 判断不等于注释时
                //{
                    textBox1.Text += childNode.InnerText;
                //}
              
                // 遍历根节点的孙节点
               foreach (XmlNode item in childNode.ChildNodes)
               {
                   // 【注意2:把根节点中的子节点的注释当成孙节点】
                   textBox2.Text += item.InnerText;
               }

            }
        }

效果图:

2、如果不要注释这个节点元素,可以根据XmlNodeType这个枚举类型来判断。

 // 摘要:
    //     指定节点的类型。
    public enum XmlNodeType
    {
        // 摘要:
        //     如果未调用 Read 方法,则由 System.Xml.XmlReader 返回。
        None = 0,
        //
        // 摘要:
        //     元素(例如,<item>)。
        Element = 1,
        //
        // 摘要:
        //     特性(例如,id='123')。
        Attribute = 2,
        //
        // 摘要:
        //     节点的文本内容。
        Text = 3,
        //
        // 摘要:
        //     CDATA 节(例如,<![CDATA[my escaped text]]>)。
        CDATA = 4,
        //
        // 摘要:
        //     实体引用(例如,&num;)。
        EntityReference = 5,
        //
        // 摘要:
        //     实体声明(例如,<!ENTITY...>)。
        Entity = 6,
        //
        // 摘要:
        //     处理指令(例如,<?pi test?>)。
        ProcessingInstruction = 7,
        //
        // 摘要:
        //     注释(例如,<!-- my comment -->)。
        Comment = 8,
        //
        // 摘要:
        //     作为文档树的根的文档对象提供对整个 XML 文档的访问。
        Document = 9,
        //
        // 摘要:
        //     由以下标记指示的文档类型声明(例如,<!DOCTYPE...>)。
        DocumentType = 10,
        //
        // 摘要:
        //     文档片段。
        DocumentFragment = 11,
        //
        // 摘要:
        //     文档类型声明中的表示法(例如,<!NOTATION...>)。
        Notation = 12,
        //
        // 摘要:
        //     标记间的空白。
        Whitespace = 13,
        //
        // 摘要:
        //     混合内容模型中标记间的空白或 xml:space="preserve" 范围内的空白。
        SignificantWhitespace = 14,
        //
        // 摘要:
        //     末尾元素标记(例如,</item>)。
        EndElement = 15,
        //
        // 摘要:
        //     由于调用 System.Xml.XmlReader.ResolveEntity() 而使 XmlReader 到达实体替换的末尾时返回。
        EndEntity = 16,
        //
        // 摘要:
        //     XML 声明(例如,<?xml version='1.0'?>)。
        XmlDeclaration = 17,
    }

也就是如下代码:

private void button1_Click(object sender, EventArgs e)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("XMLFile1.xml");
            // 根节点
            XmlNode node = doc.DocumentElement;
            // 遍历根节点的子节点
            foreach (XmlNode childNode in node.ChildNodes)
            {
                // 【注意1:把根节点中的注释当成子节点】

                if (childNode.NodeType != XmlNodeType.Comment) // 判断不等于注释时
                {
                    textBox1.Text += childNode.InnerText;
                }

                // 遍历根节点的孙节点
                foreach (XmlNode item in childNode.ChildNodes)
                {
                    // 【注意2:把根节点中的子节点的注释当成孙节点】
                    if (item.NodeType != XmlNodeType.Comment) // 判断不等于注释时
                    {
                        textBox2.Text += item.InnerText;
                    }
                }

            }
        }

效果图如下:

原文地址:https://www.cnblogs.com/xiaobudong/p/6719906.html