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

2016-02-19 20:41 3 1 收藏

有了下面这个在.NET Framework中轻松处理XML数据(2-1)教程,不懂在.NET Framework中轻松处理XML数据(2-1)的也能装懂了,赶紧get起来装逼一下吧!

【 tulaoshi.com - Web开发 】

  分析属性值

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

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

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

  buf += YourResolverCode(reader.Name);

  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”的。

来源:https://www.tulaoshi.com/n/20160219/1624289.html

延伸阅读
标签: Web开发
XmlTextWriter类 用在本节中的方法创建XML文档显然并不困难。多年以来,开发者都是通过在缓存在连接一些字符串,连接好以后再把缓存中字符串输出到文件的方式来创建XML文档。但是以这种方式创建XML文档的方法只有在你保证字符串中不存在任何细小的错误的时候才有效。.NET Framework通过用XMLwriter提供了更好的创建XML文档的方法。 X...
标签: Web开发
分析属性值 大部分情况下,属性值都是一个简单的文本字符串。然而,这并不意味着实际应用中的属性值都是字符型的。有时候,属性值是由许多种类型的数据组合而成的,例如Date或Boolean,这时,你就要用XmlConvert或System.Convevt类的方法把这些类型转换成原来的类型。XmlConvert和System.Convevt类都能实现数据类型的转换,但是XmlConv...
标签: Web开发
在.NET Framework中,XmlTextReader和XmlTextWriter类提供了对xml数据的读和写操作。在本文中,作者讲述了XML阅读器(Reader)的体系结构及它们怎样与XMLDOM 和SAX 解释器结合。作者也演示了怎么样运用阅读器分析和验证XML文档,怎么样创建格式良好的XML文档,以及怎么样用函数读/写基于Base64和BinHex编码的大型的XML文档。最后,作者讲了怎么样...
标签: Web开发
图十二所示的代码演示了客户端用XMLTextReadWriter类在读操作的同时修改属性值的优势。在本期的msdn中提供了XmlTextReadWriter类的C#和VB源代码下载(见本文开头提供的链接)。 Figure 12 Changing Attribute Values private void ApplyChanges(string nodeName, string attribName, string oldVal, string newVal) { XMLTextRead...
标签: Web开发
Figure 7 States for XML Writer State Description Attribute The writer enters this state when an attribute is being written Closed The Close method has been called and the writer is no longer available for writing operations Content The writer enters this state when the content of a node is being written ...

经验教程

463

收藏

60
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部