zoukankan      html  css  js  c++  java
  • .NET基础示例系列之二十二:Xml操作简明手册

    1Xml文档示例(xmlsample.xml):

     

    Code

     

    现在xml遍地都是,没见过猪跑,也吃过猪肉。xml文档本身,这里只做一个简单的介绍,后面主要是介绍C#操作xml的一些备忘(我自己只是偶尔会用到,所以常常忘记,需要重新查,所以写下来,以志不忘)。

    XmleXtensive Makeup Language,超文本标记语言,与HTML类似,不同的是其根本目的是用来传输数据,而不是用于显示。

     

    xml相关的几个概念:

    *文档声明(Document declaration):

    <?xmlversion="1.0"encoding="iso-8859-1" ?>

    Xml文档的第一行即所谓的文档声明,告诉你这是一个xml文档。

     

    *元素(Element):

    <artist>The Chi-lites</artist>

    开始标签、相应结束标签以及所包含的内容,整个构成一个“元素”。

     

    *标签(Label):

    针对上面所举元素,<artist></artist>即所谓的标签。

     

    *属性(Attribute):

    针对元素“song”,包含属性“title”。

     

    还有向个小细节:

    *元素的标签是大小写敏感的。

    *Xml文档必须有一个根元素。

    *Xml的属性值必须加双引号。

    *特殊字符:

    <(小于),替换为&lt;

    >(大于),替换为&gt;

    &,替换为&amp;

    (单引号),替换为&apos;

    (双引号),替换为&quot;

     

    还有一些关于名称空间、以及CDATA区段等知识,有兴趣可以查看W3C文档,或者可以看看这个网站上的教程:http://www.w3school.com.cn/x.asp,上面有很详细的介绍。

     

     

    2)如何创建一个xml文档

    由于xml实质也只是一个文本文件,所以最简单你可以直接使用System.IO下的类生成一个文件,并存储成xml文件,当然,你需要手动保证该文件形式良好,比如必须有根元素、必须有关闭标签、必须正确嵌套等等。

     

    如果你懒得自己去想文件的形式,可以使用System.Xml下的类。

     

    Code

    结果:

    Code

     

    由于像XmlDeclarationXmlElement这些类都继承自XmlNode,故CreateNode()方法是最通用的,可以通过使用XmlNodeType来生成不同类型的节点。

    另外,往元素中插入文本,使用的属性是“InnerText”。

     

    方法二:

    XmlDocument还有一个LoadXml()方法,实际上跟一行一行写入文本没区别,就是预先写好xml,并把它作为字符串传给LoadXml()方法。

     

    方法三:

    如果你手头有一个DataTable,还可以使用DataTable.WriteXml()方法。

     

    Code

    结果:

     

    Code

     

     

    3)读取、查找

    当你手头有一个xml文件后,可以使用XmlDocument.Load()方法将其加载进来以便处理,所以“读取”没有什么可说的。而“查找”操作往往涉及XPath,这里只是我认为的比较常用到的查找操作,XPath这玩意实在是很强大很暴力。

     

    回头看示例文档xmlsample.xml,我们可能遇到这样的需求:

    A)查找歌曲“Hurt”的演唱者?

    B)查找流派为“R&B”的歌曲名称?

    C)查找发行年份在2004以前的歌曲的演唱者?

    D)倒数第二首歌的歌曲名称?

     

    针对上述问题,你当然可以通过递归遍历各结点来查找,不过使用XPath将是更为高效的方案:

    问题(A 

    Code

    (以“/”起始的路径必定是绝对路径,即从根元素起。而对属性的引用前面要加“@”)

     

    问题(B

    Code

     (不同于对属性的引用,对子节点的引用不需要使用“@”)

     

    问题(C

    Code

    (数值一样可以比较。)

     

    问题(D

    Code

    (具有一系列的内置函数,如last()position()等等)

     

    Ps

    如何实现XPath查找时忽略大小写?

    例如示例文档中的“专辑”一栏中,有时将未知写着“unknown”,有的写着“Unknown”,如何将它们都查询出来?

    Code

    (使用translate()函数将其先转化为小写后再比较。)

     

     

    4)修改

    在完成了第三小节的查找定位之后,修改操作实际上就比较简单了。使用的方法不外乎:

    RemoveChild()  删除节点

    AppendChild()  添加节点

    SetAttribute()  设置属性

    InsertAfter(),InsertBefore()  类似于AppendChild(),但是可以更精确地指定要插入的位置,因为AppendChild()中是简单地追加。

     

    值得一提的是ImportNode()方法,比如我们想将倒数第二首歌曲“Hurt”的所有信息复制一遍追加到文档的末尾,如果我们这么写:

     

    Code

     

    上面的代码得到的效果类似于“剪切”,就是原来倒数第二首歌被放到最末尾了。想要实现“拷贝”的效果,我们可以这么写:

    ImportNode()方法对于不同的xml文档中拷贝节点尤其有用。

    Code

     

     

     

     

     

     

     

  • 相关阅读:
    Maven学习笔记
    [学习笔记] 网络流
    [Contest on 2021.11.3] 女子口阿
    [杂题合集] 25 岁小伙突然没了心跳,他的习惯很多年轻人都有!
    CSP 2021 提高组游记
    [题目小结] 可持久化数据结构
    [学习笔记] 无向图和有向图的连通分量
    [Contest on 2021.10.17] HustOJ 就是个 **
    [Contest on 2021.10.15] 细思极恐
    妖怪寺外,灯火通明
  • 原文地址:https://www.cnblogs.com/morvenhuang/p/1581920.html
Copyright © 2011-2022 走看看