对xml文档数据的读取

在短暂的C#程序开发过程中,我发现使用xml文档来存储一些数据还是很不错的!当然有了数据当然要读取,在开发过程我遇到了两种对xml文档数据进行读取的方法。

  • 就是最基本的利用System.Xml命名空间,通过各个节点来获得xml中的数据。

例如下面的Xml数据:

<?xml version="1.0"?>
<BookStore>
    <book>
        <title>C#入门经典</title>
        <author>Karli Watson</author>
        <pages>888</pages>
    </book>
    <book>
        <title>长安乱</title>
        <author>韩寒</author>
        <pages>260</pages>
    </book>
        <book>
        <title>一座城池</title>
        <author>韩寒</author>
        <pages>300</pages>
    </book>
        <book>
        <title>三重门</title>
        <author>韩寒</author>
        <pages>280</pages>
    </book>
        <book>
        <title>红楼梦</title>
        <author>曹雪芹</author>
        <pages>1200</pages>
    </book>
        <book>
        <title>三国演义</title>
        <author>罗贯中</author>
        <pages>1000</pages>
    </book>
        <book>
        <title>疯狂的程序员</title>
        <author>绝影</author>
        <pages>300</pages>
    </book>
        <book>
        <title>老人与海</title>
        <author>海明威</author>
        <pages>190</pages>
    </book>
</BookStore>

将这个xml文档保存在桌面上,文件名为:“BookStore.xml”,通过递归算法,将每个节点全部得到,再输出。

       static public void ReadXmlByNode()
        {
            XmlDocument document = new XmlDocument();
            document.Load(FilePath);

            XmlNode RootNode = document.DocumentElement; //得到根节点
            getValue(RootNode);
        }

        static public void getValue(XmlNode node)
        {
            if (node.ChildNodes.Count == 0)
            {
                Console.WriteLine(node.InnerText);
            }
            else
            {
                foreach (XmlNode ChildNode in node.ChildNodes)
                {
                    getValue(ChildNode);
                }
            }
        }
 

这样就可以将xml中的数据全部输出,但是这种方式在大批量的输出的时候得到的数据太乱,不好操作。对于特定(指定)节点进行操作,这个方法是可以的。

  • 还有一种办法是直接将xml文档转化为DataTable数据,这样即使是大批量的数据也可以很好的组织起来,有利于后面程序对数据的操作
       static public void ReadXmlByDataSet()
        {
            DataSet dataset = new DataSet();
            dataset.ReadXml(FilePath, XmlReadMode.Auto);
            DataTable datatable = dataset.Tables[0];
            foreach (DataRow row in datatable.Rows)
            {
                for (int i = 0; i < datatable.Columns.Count; i++)
                {
                    Console.WriteLine(row[i].ToString());
                }
            }
        }

这个对于标准的xml文档来说,是很好的一种数据读取方式。这个方式的缺点在与当xml的节点级数变多以后,就无法将所有的数据全部读出了。将上面的xml文档修改一下,改成下面的这个样子:

<?xml version="1.0"?>
<BookStore>
    <book>
        <title>C#入门经典</title>
        <author>Karli Watson</author>
        <pages>888</pages>
    </book>
    <book>
        <title>长安乱</title>
        <author>韩寒</author>
            <age>30</age>
            <sex></sex>
            <nation>汉族</nation>
            <country>中国</country>
        <pages>260</pages>
    </book>
        <book>
        <title>一座城池</title>
        <author>韩寒</author>
        <pages>300</pages>
    </book>
        <book>
        <title>三重门</title>
        <author>韩寒</author>
        <pages>280</pages>
    </book>
        <book>
        <title>红楼梦</title>
        <author>曹雪芹</author>
        <pages>1200</pages>
    </book>
        <book>
        <title>三国演义</title>
        <author>罗贯中</author>
        <pages>1000</pages>
    </book>
        <book>
        <title>疯狂的程序员</title>
        <author>绝影</author>
        <pages>300</pages>
    </book>
        <book>
        <title>老人与海</title>
        <author>海明威</author>
        <pages>190</pages>
    </book>
</BookStore>

对“长安乱”中的作者节点创建了几个子节点。仍然使用上面的dataset代码来读取数据,就会出现问题,但是使用第一种方法,则还是可以将全部数据正常的读取出来。

上面这些是我对xml文档暂时的体会,欢迎各位大神指正!

原文地址:https://www.cnblogs.com/blackcatcjy/p/3920214.html