webservices 数据和格式:XML与XML架构第8章
2013-08-30 09:53
405 查看
元语言
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
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
相关文章推荐
- MyEclipse开发JAX-RS架构WebServices收发JSON数据格式
- MyEclipse开发JAX-RS架构WebServices收发JSON数据格式
- Ajax核心XMLHttpRequest对象、(发送请求、接收)方法和属性介绍、AJAX开发框架、数据格式提要(XML、JSON、HTML)
- 万能的数据传输格式——XML/json
- 数据交换格式XML和JSON对比
- js动态生成xml数据格式
- SAX解析XML文档的时候在characters方法中解析有的时候xml文档格式凌乱的时候拿不到数据
- 关于 JSNO XML 这两种数据格式的解析记录
- 浅谈Ajax返回数据的3种格式——HTML、XML、JSON
- sp_xml_preparedocument OPENXML sp_xml_removedocument截取XML片段或指定格式的数据
- 类xml数据格式解析
- PHP生成json和xml类型接口数据格式
- 再谈谈ADO.NET Data Service 数据格式(xml和json)
- 使用Xml文件格式存储数据
- Android中的xml、json格式数据解析
- XML数据格式简介
- WCF服务返回XML或JSON格式数据
- php与Ajax(四)—xml与json数据格式
- 解析服务器传来的 XML 格式数据
- 格式数据解析—XML