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

路过的公子

路过的公子

2016-02-19 14:51

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的在.NET Framework中轻松处理XML数据(二)教程,一起来看看吧!超容易上手~

分析属性值

大部分情况下,属性值都是一个简单的文本字符串。然而,这并不意味着实际应用中的属性值都是字符型的。有时候,属性值是由许多种类型的数据组合而成的,例如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类型之间的相互转换工作。当转换工作发生时,转换结果是局部的。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

在某些解决方案中,属性值是由纯文本和实体共同组成的。在所有的阅读器类中,只有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);

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

else

// Just append the value to the buffer

buf += reader.Value;

}

当属性值全部被分析后,ReadAtributeValue方法返回False, 从而结束循环。属性值的最终结果就是全局变量buffer的值了。

处理XML文本(Text)

当我们在处理XML标签文本时,如果不能正确的处理,它的错误原因能很快地确定。例如一个字符转换错误,它必然是传输了非XML文本到一个XML数据流中。不是所有在给定的平台中有效的字符都是有效的XML字符。只有在XML规范(www.w3.org/TR/2000/REC-xml-20001006.html)中规定的有效的字符才能安全的用作元素和属性名。

XmlConvert类提供了把非XML标准的命名转换成标准的XML命名的功能。当标签名中包含有无效的XML字符时,EncodeName 和 DecodeName方法能把它们调整成符合Schema的XML命名。包括SQL Server? 和Microsoft Office,这些应用程序允许及支持Unicode文档,然而,这些文档中的字符有些也不是有效的XML命名。典型的情况是在你处理数据库中包含空格的列名时。虽然SQL Server允许长列名,但这对XML流来说可能就不是有效的命名。空格会被十六进制代码Invoice_0x0020_Details替代。下面的代码演示了怎么样在程序中获得该字符串:

XmlConvert.EncodeName("Invoice Details");

与此相反的方法是DecodeName。该方法把XML文本转换成其原始的格式。要注意的是它只能转换完整的十六进制代码,只有_0x0020_才被当成一个空格,而_0x20_就不是了:

XmlConvert.DecodeName("Invoice_0x0020_Details");

在XML文档中的空格即重要也不重要。说它重要,是当它出现在元素的内容中或者它在注释语句中时,它能表示实际意义。例如下面的情况:

 

<MyNode xml:space="preserve">

<!-- any space here must be preserved -->

???

</MyNode>

在xml中,空格不只是代表空格(空白),也代表回车、换行和缩进。

通过XmlTextReader类的WhiteSpaceHandling属性你可以处理空格。这个属性接受及返回一个WhiteSpaceHandling枚举值(该枚举类有三种可选值)。默认值是All,它表示有意义和无意义的空格都会作为节点返回---- 分别为SignificantWhitespace和Whitespace节点。 另一个枚举值是None,它表示对任何空格都不作为节点返回。最后,就是Signficant枚举值,它表示忽略没有意义的空格,而只返回节点类型为SignficantWhitespace的节点。注意WhiteSpaceHandling属性是少数阅读器属性中的一个。它能被改变在任何时候和给Read操作带来影响。而Normalization及 XmlResolver属性是“Sensitive”的。

String和Fragment

程序员把在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类解释。

    作者:chyich(译)/ASPCool

展开更多 50%)
分享

猜你喜欢

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

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

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

Web开发
在.NET Framework中轻松处理XML数据(三)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

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

Web开发
在.NET Framework中轻松处理XML数据(一)

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

Web开发
在.NET Framework中轻松处理XML数据(五)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

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

Web开发
在.NET Framework中轻松处理XML数据(四)

在.NET Framework中轻松处理XML数据(5-2)

Web开发
在.NET Framework中轻松处理XML数据(5-2)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

使XML本地化和关系化

使XML本地化和关系化

手机QQ怎么关闭“附近的人”

手机QQ怎么关闭“附近的人”
下拉加载更多内容 ↓