在.NET Framework中轻松处理XML数据(二)

转载 2006年06月15日 09:36:00
分析属性
大部分情况下,属性值都是一个简单的文本字符串。然而,这并不意味着实际应用中的属性值都是字符型的。有时候,属性值是由许多种类型的数据组合而成的,例如Date或Boolean,这时,你就要用XmlConvert或System.Convevt类的方法把这些类型转换成原来的类型。XmlConvert和System.Convevt类都能实现数据类型的转换,但是XmlConvert类依据XSD中指定的数据类型进行转换,而不管它现在是什么类型。
假设你有以下的XML数据片断:

让我们先确认,birthdaay属性值是February 8, 2001,如果你用System.Convert类把该字符串转换成.NET Framework中的DateTime类型,这样,我们就可以把它当成date类型使用了。相比下,如果你用XmlConvert类来转换字符串,你将看到一个分析错误,因为XmlConvert类不能正确解释这个字符串中的日期。因为在XML中,日期型数据的格式必须是YYYY-MM-DD形式的。XmlConvert类担任CLR类型与XSD类型之间的相互转换工作。当转换工作发生时,转换结果是局部的。
在某些解决方案中,属性值是由纯文本和实体共同组成的。在所有的阅读器类中,只有XmlValidatingReader类能处理实体。XmlTextReader虽然不能处理实体,但它们同时出现在属性值中的时候,它只能把文本值取出来。出现这种情况,你必须用ReadAttributeValue方法替代简单的读方法来分析属性值的内容。
ReadAttributeValue方法分析属性值,然后把各个组成的要素分隔开(如把纯文本和实体分开)。你可以用ReadAttributeValue方法的返回值作为循环条件,遍历整个属性值中的要素。既然XmlTextReader类不能处理实体,那么你可以自己写一个用于处理实体的类。下面的代码片断演示了怎么调用一个自定义的处理类:
while(reader.ReadAttributeValue())
{
if (reader.NodeType == XmlNodeType.EntityReference)
// Resolve the "reader.Name" reference and add
// the result to a buffer
buf += YourResolverCode(reader.Name);
else
// Just append the value to the buffer
buf += reader.Value;
}
处理XML文本(Text)
XmlConvert.EncodeName("Invoice Details");
XmlConvert.DecodeName("Invoice_0x0020_Details");
 
<MyNode xml:space="preserve">
<!-- any space here must be preserved -->
•••
</MyNode>
在xml中,空格不只是代表空格(空白),也代表回车、换行和缩进。
通过XmlTextReader类的WhiteSpaceHandling属性你可以处理空格。这个属性接受及返回一个WhiteSpaceHandling枚举值(该枚举类有三种可选值)。默认值是All,它表示有意义和无意义的空格都会作为节点返回---- 分别为SignificantWhitespaceWhitespace节点。另一个枚举值是None,它表示对任何空格都不作为节点返回。最后,就是Signficant枚举值,它表示忽略没有意义的空格,而只返回节点类型为SignficantWhitespace的节点。注意WhiteSpaceHandling属性是少数阅读器属性中的一个。它能被改变在任何时候和给Read操作带来影响。而Normalization XmlResolver属性“Sensitive”的。
StringFragment

程序员把在MSXML的程序剪切下来,会发现在COM和.NET Framework XML API 之间的差别很大。.NET Framework类本身没有提供方法去分析存储在字符串中XML数据。不像MSXML分析器对象,XmlTestReader类没有提供任何一种LoadXML方法从一个格式良好的字符中创建阅读器。没有提供类似LoadXML的方法因为你可以用特殊的text reader---StringReader类来获得同样的功能。

XmlTextReader其中一个构造函数接受一个TextReader派生对象和一个XML reader作参数(该阅读器以text reader的内容为基础创建)。一个text reader类是一个流,这个流是输入的字符经优化生成的。StringReader类继承TextReader类,并用一个内存中字符串作为其输入流。下面的代码片断演示了怎样初始化一个XML reader,用一个格式良好的XML 字符串作为其输入:

string xmlText = "...";

StringReader strReader = new StringReader(xmlText);

XmlTextReader reader = new XmlTextReader(strReader);



另外,用StringWriter类代替TextWrite类,你可以从内存字符中创建一个XML文档。

一个指定类型的XML字符串是一个XML片断(fragment). XML片断由XML文本构成,但没有根节点的XML文档不是格式良好的XML文档,所以不能被应用。一个XML片断是原始的文档的一部分,所以它可能缺少根节点。例如,下面的XML文本是一个有效的XML 片断,但不是一个有效的XML文档,因为它没有根节点:

Dino

Esposito

.NET Framework XML API允许程序员把XML片断与一个分析器内容结合使用,分析器内容由类似encoding字符集,DTD文档,命名空间,语言和空格处理程序构成:

public XmlTextReader(

string xmlFragment,

XmlNodeType fragType,

XmlParserContext context

);

xmlFragment参数包括了XML字符串分析。FragType参数表示fragment的类型,它给出了fragment根节点的类型。只有element,attibute和document类型的节点才能作为fragment的根节点,分析器的内容才能被XmlParserContext类解释。

相关文章推荐

.NET Framework中的XML序列化

  • 2008-06-22 17:51
  • 122KB
  • 下载

SQL Server .NET Framework 数据提供程序连接池

建立池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户端应用程序提供连接池。您也可以提供几个连接字符串修饰符来控制...

【.net】DbProviderFactories找不到请求的 .Net Framework 数据提供程序。可能没有安装”的问题

今天运行一个历史项目的时候报错,DbProviderFactories找不到请求的 .Net Framework 数据提供程序。可能没有安装”的问题。_providerName为“Oracle.Dat...

从win32 api 到 .net framework(二)

形如windows api函数:BOOL MessageBeep( UINT uType // beep type );c#托管引用声明格式如下:[DllImport("User32.dll")] s...

查看本机安装了哪些.Net Framework版本的方法

查看本机安装了哪些.Net Framework版本的方法2010-05-27 14:49:56|  分类: 系统安装 阅读414 评论0   字号:大中小 订阅 一:第一步: 打开“我的电脑“,在地址...

win10上 安装Sqlserver2008R2数据库提示.NET Framework3.5不存在,解决之后仍然提示兼容问题安装不成功

最近项目开发过程中,需要在win10系统上安装SqlServer2008R2的时候,刚开始提示需要安装.NET Framework3.5版本,通过360软件管家安装之后,仍然不行,安装sqlserve...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)