第三十九讲 LINQ to XML

主要内容:
1. LINQ TO XML
LINQ TO XML是一种启用了LINQ的内存XML编程接口
1. 从文件或流加载XML
2. 将XML序列化为文件或流
3. 使用函数构造从头开始创建XML
4. 使用类似XPath的轴查询XML
5. 使用Add,Remove,ReplaceWith和SetValue等方法对内存XML树进行操作
6. 使用XSD验证XML
7. 使用这些功能的组合,可将XML树从一种形状转换为另一种形状。

2. XML简介
XML(Extensible Markup Language)即可扩展标记语言
1. XML是Internet环境中跨平台的
2. 依赖于内容的技术
3. 处理结构化文档信息的有力工具

XML语法特点
1. 标签必须成对出现,有开始就必须有结束,如:
<number>100</number>或
<cid text="1">,这个反斜杠就是结束的一个重要标志。
2. 标签,属性的写法随心所欲,没有任何强制规定,换句话说,一个XML文档只要你保证它有一个根节点(也只能有一个)之后,你爱写多少节点都行。
3. 所有的特征都必须有值
4. 所有的特征都必须在值的周围加上双引号。


3. 命名空间和类
System.Xml.Linq.dll程序集定义了三个命名空间
System.Xml.Linq
System.Xml.Schema
System.Xml.XPath


4. 一系列的实践
1. 直接创建XML文档

2. 使用Xdocument创建XML文档
1. XDocument类包含有效的XML文档所需的信息。其中包括XML声明,处理指令和注释。
2. XElement类为XML文档的一个节点,它可以创建XML树,向它添加其他XML树,修改XML树并进行保存

3. 使用XElement创建XML文档
4. 数组 TO XML
5. 复杂类型 TO XML
6. 载入现有的XML
7. LINQ遍历XML
8. 精准遍历

9. WHERE条件超精准遍历


动手操作老师讲过的实例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

//必须的类库文件
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;
using System.Xml.XPath;

namespace WF39
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// XElement类的使用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender,EventArgs e)
        {
            textBox1.Text = "";

            XElement xe = new XElement("root",new XElement("A",new XElement("A1","hello"),new XElement("A2","how are you")),new XElement("B",new XElement("B1","Yes"),new XElement("B2","I'm fine,and you")),new XElement("C",new XElement("C1","我是中国人"),new XElement("C2","何必学外文"),new XElement("C3","不学ABC"),new XElement("C4","照样当经理"))
            );
            textBox1.Text = xe.ToString();
            xe.Save("d:\\a.xml");
        }
        /// <summary>
        /// XDocument类的应用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender,EventArgs e)
        {
            textBox1.Text = "";

            XDocument xd = new XDocument(
                new XComment("这是注释,开始注释"),new XElement("root","照样当经理"))
            ),new XComment("注释结束了"));

            //经测试加不加这个声明版本和编码声明的语句,默认生成的xml文件都有
            //XElement,XDocument两个类结果除了XElement没有其它一些功能外,结果是一样的
            //XDocument类创建xml文档中,XElement是被作为内容的形式存在的
           // XDeclaration xde = new XDeclaration("1.0","utf-8","yes");
            
            //不过XDocument类中还有好多的小编在里面的,有待研究

            textBox1.Text = xd.ToString();
            xd.Save("d:\\b.xml");
        }

        /// <summary>
        /// 数组到XML
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender,EventArgs e)
        {
            textBox1.Text = "";

            string[] str = {"反腐就要","老虎","苍蝇","一起打","认识科技","科技是","第一生产力","对待祖国","爱祖国","爱人民" };
            XDocument xd = new XDocument(
                new XComment("表示是注释,这里开始"),new XComment("下面的是内容"),new XElement("全部内容",str.Select(x => new XElement("x",x))
                    ),new XComment("这里是注释结束")
                );

            textBox1.Text = xd.ToString();
        }
        /// <summary>
        /// 对象到XML
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender,EventArgs e)
        {
            textBox1.Text = "";

            stu[] CLS = {
                new stu{name="张三",age=20},new stu{name="李四",age=21},new stu{name="王五",age=22},new stu{name="赵六",age=23},new stu{name="韩七",age=24}
            };

            XElement xe=new XElement("students",CLS.Select(s=>new XElement("stu",new XElement("name",s.name),new XElement("age",s.age)))
                );

            textBox1.Text = xe.ToString();
            xe.Save("d:\\c.xml");
        }

        /// <summary>
        /// 载入XML文档
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender,EventArgs e)
        {
            textBox1.Text = "";

            XDocument xd = XDocument.Load("d:\\a.xml");
            XElement xe=  XElement.Load("d:\\b.xml");

            textBox1.Text = xd.ToString()+xe.ToString();
        }
        /// <summary>
        /// 遍历XML文档
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button6_Click(object sender,EventArgs e)
        {
            listBox1.Items.Clear();
            textBox1.Text = "";

            XDocument xd = XDocument.Load("d:\\a.xml");
            foreach (XNode x in xd.Nodes())
            {
                listBox1.Items.Add(x);
                textBox1.Text = x.ToString();
            }

        }
        /// <summary>
        /// 精准遍历XML
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button7_Click(object sender,EventArgs e)
        {
            listBox1.Items.Clear();
            textBox1.Text = "";
            XElement xe=XElement.Load("d:\\c.xml");
            XDocument xd = XDocument.Load("d:\\c.xml");

            //请注意我注释的部分是不能完成二层遍历的,
            //主要是因为我对其类型进行准确定义,如果使用var就可以,什么情况?
            //IEnumerable<XNode> xn = xe.Descendants("stu").Select(x=>x);
            //foreach (XNode x in xn)
            //{
            //    listBox1.Items.Add(x);
            //}

            //就下面这样的写法成功后,把鼠标放上去一看,原来第一层遍历是XElement
            //第二层是XNode,那么,在Linq遍历中应该使用IEnumerable<XElement>了吧
            var xn = xe.Descendants("stu").Select(x => x);
            foreach (var x in xn)
            {
                //listBox1.Items.Add(x);//这样写的你可以测试一下,它会把显示整个stu节点的内容
                listBox1.Items.Add(x.Value);
                foreach (var y in x.Nodes())
                {
                    listBox1.Items.Add(y.ToString());
                }
            }

            listBox1.Items.Add("\n=========================\n");

            IEnumerable<XElement> xne = xd.Descendants("stu").Select(x => x);
            foreach (XElement x in xne)
            {
                listBox1.Items.Add(x.Value);//串连文本?把子节点内容串起来的文本
                foreach (XNode y in x.Nodes())
                {
                    listBox1.Items.Add(y.ToString());
                }
            }
        }
        /// <summary>
        /// 带WHERE条件的
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button8_Click(object sender,EventArgs e)
        {
            listBox1.Items.Clear();
            textBox1.Text = "";
            XDocument xd = XDocument.Load("d:\\c.xml");

            listBox1.Items.Add("\n=======字符中包含张========\n");
            var xn = xd.Descendants("stu").Where(x => x.Value.Contains("张")).Select(x=>x);
            foreach (var x in xn)
            {
                //listBox1.Items.Add(x);//这样写的你可以测试一下,它会把显示整个stu节点的内容
                listBox1.Items.Add(x.Value);
                foreach (var y in x.Nodes())
                {
                    listBox1.Items.Add(y.ToString());
                }
            }

            listBox1.Items.Add("\n====下面是字符中不包含张========\n");

            var xn2 = xd.Descendants("stu").Where(x => !x.Value.Contains("张")).Select(x => x);
            foreach (var x in xn2)
            {
                //listBox1.Items.Add(x);//这样写的你可以测试一下,它会把显示整个stu节点的内容
                listBox1.Items.Add(x.Value);
                foreach (var y in x.Nodes())
                {
                    listBox1.Items.Add(y.ToString());
                }
            }

        }
        /// <summary>
        /// SetElement
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button9_Click(object sender,EventArgs e)
        {
            listBox1.Items.Clear();
            textBox1.Text = "";
            XDocument xd = XDocument.Load("d:\\c.xml");
            
            listBox1.Items.Add("\n***字符中包含张的节点中追加一个子节点***\n");
            var xn = xd.Descendants("stu").Where(x => x.Value.Contains("张")).Select(x => x);
            
            foreach (var x in xn)
            {
                //listBox1.Items.Add(x);//这样写的你可以测试一下,它会把显示整个stu节点的内容
                listBox1.Items.Add(x.Value);
                x.SetElementValue("追加的内容","我在这里呢");
                
                
                foreach (var y in x.Nodes())
                {
                    //y.AddAfterSelf("在节点后追加内容","二次追加内容");
                    listBox1.Items.Add(y.ToString());
                    
                }
            }
        }
    }
    /// <summary>
    /// 一个简单的学生类
    /// </summary>
    public class stu
    {
        public string name{ get; set; }
        public int age { get; set; }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇