• webservices 数据和格式:XML与XML架构第8章


    元语言

       XML:可扩展的标记语言(eXrensible Markup Language),实际是一种元语言.

      为什么XML会成为当今的首先呢?有三个方面:

        a.XML很简洁

        b.XML很容易读

        c,一切为了标准化,而机遇选择了XML

    XML文档和命名空间

      XML文档很容易生成;有两个主要的规范对于几乎每个 文档都有影响:XML1.0和XML1.0命名空间。

     XML文档是一系列元素以及能被应用到元素上的属性。

     例如:

        <address addressType='Business'>100 MAin street</address>

    之前文档有XML标准:所有标记都有闭合也就是结束元素</address>,而我有给元素增加了一个属性“addressType".

    XML命名空间(namespace)是一个惟一标识符----通常是一个URL,但总是一个URI(uniform resource identifiter 统一资源标识符)---是元素和属性名字的集合.

      例如:

          <myDoucument>

            <address xmlns="keithba/Contacts" addressType="Business">100 Main Street</address>

            <address xmlns="http://keithba.com/books">http://www.msnbc.com</address>

        </myDocument>

    命名空间在XML文档中使用特别的属性xmlns标明.看出命名空间和统一资源标示符的区别:URI是一个更大的项目类别。URL必须指向一个位置(例如,一个页面的web),

    而URI只是一个惟一的通用名字,它可能指向,也可能不指向一个位置。

    在带有命名空间的(xmlns=""属性)某个元素下的每个元素,包含这个元素本身,都被认为是在那个命名空间中。在同样的默认情形下,属性却不是;属性默认是在""命名空间中.命名空间还允许我们使用前缀,它是完整的简写形式。这是得我们 用命名空间限定属性,以及混合使用不同命名空间的元素,如:

      <c:Contact xmlns=c:"http://keithba.com/Contacts"

            xmlns=b:"http://keithba.com/bookmarks">

      <c:name>keith Ballinger</c:name>

      <c:address c:addressType="Business"> 100 Main Street</c:address>

       <b:address> http://www.msnbc.com</address>

      <c:Contact>

    这种元素(或属性)的实际命名空间与元素(或属性)的局部命名组合,被称为元素(或属性)的完全限定名(fully qualified name, FQN).

    需要指出的最后一个XML概念是混合内容(mixed content):意思就是元素可以包含文本,或者它还能包含其它元素,也可以让元素包含这两者。

     例如:

        <myDocument>

          <address xmlns="keibat/contact" addressType="Business">

           100 Main Street

          <Country>USA</Country>

          </address>

          <address xmlns="http://keibat.com/Bookmarks">

            http://www.msbnc.com

          </address>

        </myDocument>

    其实这样并不好,实际上这会使得对它们进行编码变得更困难。所以把XML混合内容中的文本单独提出来用元素封装起来。

    例如:   

      <myDocument>

          <address xmlns="keibat/contact" addressType="Business">

           <Street>100 Main Street<Street>

          <Country>USA</Country>

          </address>

          <address xmlns="http://keibat.com/Bookmarks">

            http://www.msbnc.com

          </address>

        </myDocument>

    用XML和命名空间编辑

      .Net框架之下,有三种方式进行XML编辑

        a.使用XMLTextReader和XMLTextWriter基于流的编辑

        b.使用XMLDocument基于DOM的编辑

        c.一种混合式的称为XML序列化的方式(这个之前已经有讲过)

     基于流的XML处理

      处理XML流的两种一般已被接受的方法是:基于拉的(pull-based)解析器和基于推的(push-based)解析器,

      基于推的解析器一般是以SAX标准为基础,而.net框架并没有提供基于推的解析器,相反,它提供了一个有趣的替代品,即基于拉的解析器.

      读取流:

        对于读取流的基本处理,步骤如下:

          a.根据XML的流创建一个解析器实例

          b.调用Read()方法。

          c.检查解析器的NodeType,Name,Value和其他属性,以获取当前的节点的信息。

          d.如果当前节点有你感兴趣的内容,对它作相应的处理

          e.重复2~4步直到为EOF(end of file,表示流,文件或缓存为空的通用术语).直到Read()为false,或者你已经完成处理。

       写一个小函数,他接受一个文件名,并解析器在XML文件中所遇到的每个节点从解析器输出NodeType,Name和Value属性

        private void ParseFile(string filename)

        {

          try{

             FileStream stream=new FileStream(filename,FileMode.Open);

            XMLTextRead reader=new XMLTextRead(stream);

            while(reader.Read())

            {

              writeLine(reader.NodeType.ToString(),reader.Name,reader.Value);

            }

            stream.close();  

          }catch(Exception ex)

          {

            MessageBox.show(ex.ToString());

           }

      }

      注意代码中,reader对象

      NodeTypes(这是枚举) :Element(元素,例如:'<Users>'),EndElement(末尾结束元素,例如:"<Users>",Whitespace(空白)和Text(文本内容);

      Name:元素局部名称;例如:地址对应<address>

      Namespace:元素的命名空间;例如:”http://keithba.com/Contacts“;

      IsEmptyElement:如果元素为空,它会告诉你;例如:<address/>

      GetAtrribute(String name): 得到指定属性值

    写入流:

          将XML写入比较简单,在.Net框架下,使用XmlTextWriter类,处理过程为:

          a.根据一个流或文件名创建一个XmlTextReader对象。

       b.使用WriteStartDocument方法开始向流中写入XML文档。

       c.对于每个元素,使用WriteStartElement方法作为开始。

       d.现在为元素写入数据,通常通过WriteString方法。(属性也可以使用WriteAttributeString或WriteAttribute方法写入)

       e.使用WriteEndElement方法关闭元素

       f.使用WriteEndDocument方法关闭文档.

      例如:

        XmlTextWriter writer=new XmlTextWriter(''c://text.xml",System.Text.UTF8Ecoding.UTF8);

        writer.WriteStartDocument();

        writer.WriteStartElement("c","Contacts","http://keithba.com/Contacts");

        writer.WriteStartElement("address");

        writer.WriteString("100 Main Street.");

        writer.WriteEndElement();

        writer.WriteEndElement();

        writer.WriteEndDocument();

        writer.close();

     将会向文件C:/test.xml 写入下面的XML

          <?xml version="1.0" encoding="UTF8"?>

      <c:Contacts xmlns="http://keithba.com/contacts">

      <address>100 Main Street.</address>

      </c:Contacts>

      还可以写复杂的,在XmlTextWriter类上有许多有用的方法和属性,包括以上例子中使用的:

        Indentation:属性设置XML是否在写的时候格式化。这个属性可以是Formatting.Indented或Formatting.None(默认值)

       WriteStartElement:方法写出一个打开的元素标记:<address>

       WriteEndElement;方法写出一个关闭的元素标记:</address>

       WriteAttributeString:方法写出一个属性和它的值

       等等;

    基于DOM的编辑

      通过.net框架操作XML

  • 相关阅读:
    oracle数据库物理结构逻辑结构内存区块进程管理
    系统的数据库设计
    大数据和高并发的解决方案总结
    Asp.net+WebSocket+Emgucv实时人脸识别
    初识Docker
    变位词程序的实现
    分布式系统常见问题#转载
    六类排序算法的C#实现
    Asp.net MVC 中Controller返回值类型ActionResult
    将应用程序中的一些参数写到xml配置文件中
  • 原文地址:https://www.cnblogs.com/jzhou/p/3290812.html
Copyright © 2020-2023  润新知