键盘敲烂,月薪过万作业不做,等于没学
当前系列: 垃圾桶 修改讲义
什么是XMLEXtensible Markup Language)

是一种文本文件格式,由:标签和属性组成元素(节点),由元素组成“树状结构”

复习:html (html5 vs xhtml)

比HTML更严格:

  • 必须有而且只能有一个根节点
  • 大小写敏感
  • 必须闭合
  • 属性值必须是双引号

被设计用来传输和存储数据(竞争对手:Json)

其他:

  • 注释
  • 实体引用(保留字符替代)??


XML文件生成和加载

理解:

  • 需要动态生成XML
  • 序列化:从对象(内存数据)到文件(字节流)

            XElement luckystack = new XElement(
                "luckystack",                       //节点名称
                new XComment("源栈欢迎您!"),        //注释
                new XElement("location", "CQ",      //location为节点名称,CQ为值
                    new XAttribute("head", true)),  //元素属性
                new XElement("teachers",
                    new XElement("name", "大飞哥",
                        //一个元素可以有多个=属性
                        new XAttribute("position", "head"),
                        new XAttribute("age", 1)),
                    new XElement("name", "小鱼", new XAttribute("position", "UI")),
                    //元素也可以没有属性
                    new XElement("name", "阿杰")
                )
            );
            Console.WriteLine(luckystack);

演示(复习)

  • XName 究竟是什么鬼?为什么不能new XName()?为什么可以使用string表示XName?(插入:自定义隐式/显式转换
  • 参数关键字 param

生成XML文件:

            XDocument document = new XDocument(
                new XDeclaration("1.0", "utf-8","yes"),   //添加一个XML声明
                luckystack);
            document.Save("C:\\17bang\\luckystack.xml");

看一看XML的继承关系:XObject

XML声明只能在文件中才能显示,为什么?(源代码查找演示

  • Console.WriteLine(object) => Console.WriteLine(object.ToString())
  • XDocument.ToString() => XNode.ToString() => OmitXmlDeclaration
ws.OmitXmlDeclaration = true;

程序员尤其需要“自学”能力!如果什么都要飞哥给你讲了你才会,那飞哥得给你讲十年……但十年之后飞哥给你讲的技术又特么过时了!培训班,只能是一个“师傅领进门”的过程。

加载XML文件:

XElement element = XElement.Load("C:\\17bang\\luckystack.xml");


XML操作

查:其实是最核心的内容,因为实现要找到进行操作的对象或位置

简单查找可直接使用XNode及其子类的自有属性:

            Console.WriteLine(
                //element
                //element.FirstNode
                //element.Element("teachers")
                element.Element("teachers").FirstNode
            ((XElement)element.Element("teachers").FirstNode).Attribute("position"));

复杂查找推荐使用Linq to XML,其实上述XML的生成和加载都是Linq to XML的一部分(都在System.Xml.Linq名称空间下)。

        var teachers = from x in element.Descendants()
                //where x.Name == "name"           //可以多个where一起使用
                //where x.Value.Contains("飞哥")   //特别注意使用Value进行查询得到的结果   
                //where !x.HasAttributes
                where (string)x.Attribute("position") == "UI"    //为什么这里可以使用(string)进行强制转换?
                //where x.Attribute("position").ToString() == "UI" //如果用ToString()会发生什么?
                select x;

在Linq的查询结果中进行增删操作:

  • 增:Add
  • 删:Remove
  • 改:Set
        IList<XElement> lstTeachers = teachers.ToList();
        //foreach (var item in teachers)
        foreach (var item in lstTeachers)  //区别在哪?
        {
            //这是否违法了foreach“只读”的规则?
            //item = new XElement();
            item.Remove();
        }

用ToList()和不用ToList()的区别,复习:

衡量一个程序员的水平,除了看他能写出什么样的代码,还可以看他能读懂什么样的代码!

读代码比写代码更难,同学们要有意识的练习阅读源代码的能力,还有查看异常信息的能力……


作业

---------------------------
基础
---------------------------

  1. 按以下格式生成一个XML对象:
  2. <articles>
      <!-- 以下存放所有“源栈”所有文章 -->
      <article isDraft="false">
        <id>1</id>
        <title>源栈培训:C#进阶-7:Linq to XML</title>
        <body>什么是XML(EXtensible Markup Language)是一种文本文件格式被设计用来传输和存储数据由:标签和属性组成元素(节点),由元素组成“树状结构”必须有而且只能有一个根节点其他: </body>
        <authorId>1</authorId>
        <publishDate>2019/6/18 18:15</publishDate>
        <comments>
          <comment recommend="true">
            <id>12</id>
            <body>不错,赞!</body>
            <authorId>2</authorId>       
          </comment>
          <comment>
            <id>14</id>
            <body>作业太难了</body>
            <authorId>3</authorId>
          </comment>
        </comments>
      </article>
      <article isDraft="true">
        <id>2</id>
        <title>源栈培训:C#进阶-6:异步和并行</title>
        <authorId>1</authorId>
      </article>
    </articles>
  3. 然后,将其以文件形式存放到磁盘中;
  4. 再从磁盘中读取到内存中。
  5. 在根节点下添加一个新的article元素,内容至少包含id、title和authorId
  6. 删除id=12的评论
  7. 改变id=2的article:isDraft=false,title=源栈培训:C#进阶-8:异步和并行

---------------------------
进阶
---------------------------

  1. 参照上述articles,代码生成一个XML的users对象,能够存放用户的id、name和password,然后并存放到磁盘
  2. 扩展user和articles的内容,使其能够完成以下操作:
    • 根据用户名查找他发布的全部文章
    • 统计出每个用户各发表了多少篇文章
    • 查出每个用户最近发布的一篇文章
    • 每个用户评论最多的一篇文章
    • 删除没有发表文章的用户

---------------------------
高级
---------------------------

  1. 改写之前的对象模型中的Repoistory,使其能够:
    • 以XML文件格式存储各种文章、求助和建议
    • 并以此为基础,实现他们的增删改查
  2. 文件存放建议:
    • 文件User.xml存放所有用户信息
    • 文件夹\Article、\Problem和\Suggest下分文件存放文章及评论信息,文件名可使用不重复的Id,如:540.xml
    • 还可以考虑使用索引表(注意要用代码生成)以方便快速查询,如AuthorArticle.xml表存放作者Id和文章Id之间的对应关系……


作业点评

  • 简单几率使用:DateTime.Now.Ticks % 2 == 0
  • 特别小心字符串
  • 能不ToList()就不ToList()
  • 测试驱动啊!


学习笔记
源栈学历
今天学习不努力,明天努力找工作

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 垃圾桶 中继续学习:

上一课: 课程改革

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码