zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HTML5结构
    HTML5新增的非主体元素header元素、footer元素、hgroup元素、adress元素
    CF GYM 100703G Game of numbers
    CF GYM 100703I Endeavor for perfection
    CF GYM 100703K Word order
    CF GYM 100703L Many questions
    CF GYM 100703M It's complicate
    HDU 5313 Bipartite Graph
    CF 560e Gerald and Giant Chess
    POJ 2479 Maximum sum
  • 原文地址:https://www.cnblogs.com/jzhou/p/3290812.html
Copyright © 2011-2022 走看看