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

原文地址:https://www.cnblogs.com/jzhou/p/3290812.html