NET Framework轻松处理XML数据(2)

注意,所有XmlTextReader类的公共(public)构造函数都要求你指定数据源,数据源可以是stream、文件或者其它。XmlTextReader默认的构造函数是受保护的(protected),所以不能直接使用。像。NET Framework中所有的阅读器类一样(如SqlDataReader类),一旦阅读器对象连接并打开,你就可以用Read方法去访问数据了。开始的时候只能用Read方法把指针移到第一个元素;然后我们可以用Read方法或其它方法(如Skip,MoveToContent和ReadInnerXml)移动指针到下一个节点元素。要处理整个XML文档的内容,可以根据Read方法的返回值用一个循环遍历文档内容,因为Read方法返回一个布尔值,当读到文档的尾节点时,Read方法返回false,否则它返回true。

Figure 3 Outputting an XML Document Node Layout

string GetXmlFileNodeLayout(string file)

{

// 创建一个XmlTextReader类使它指向目标XML文档

XmlTextReader reader = new XmlTextReader(file);

// 循环取出节点的文本并放入到StringWriter对象实例中

StringWriter writer = new StringWriter();

string tabPrefix = "";

while (reader.Read())

{

// 写开始标志,如果节点类型为元素

if (reader.NodeType == XmlNodeType.Element)

{

//根据元素所处节点的深度,加入reader.Depth个tab符,然后把元素名写入到<>中。

tabPrefix = new string(’/t’, reader.Depth);

writer.WriteLine("{0}<{1}>", tabPrefix, reader.Name);

}

else

{

//写结束标志,如果节点类型为元素

if (reader.NodeType == XmlNodeType.EndElement)

{

tabPrefix = new string(’/t’, reader.Depth);

writer.WriteLine("{0}", tabPrefix, reader.Name);

}

}

}

// 输出到屏幕

string buf = writer.ToString();

writer.Close();

// 关闭流

reader.Close();

return buf;

}

  图三演示了一个简单的用于输出一个给定的XML文档的节点元素的函数。该函数先打开一个XML文档,然后用循环处理XML文档中所有的内容。每次调用Read方法,阅读器的指针都会向下移一个节点。大部分情况下,用Read方法可以处理的元素节点,但有时候,当你从一个节点移动到下一个节点时,可能是在两个不同类型的节点间移动。但是Read方法不能在属性节点之间移动。阅读器的MoveToContent方法可以让指针从头部节点位置跳到第一个内容节点位置。在ProcessingInstruction, DocumentType, Comment, Whitespace和SignificantWhitespace类型节点中也可以用Skip方法移动指针。

  每个节点的类型是XmlNodeType枚举中的一种,在如图三所示的代码中,我们只用了其中的两种类型:Element 和EndElement。输出源码重新定制了原始的文档结构,它丢弃或者说是忽略了XML元素的属性和节点内容,只输出了元素节点名。假设我们运用了下面的XML片断:

<mags>

<mag name="MSDN Magazine">

MSDN Magazine

</mag>

<mag name="MSDN Voices">

MSDN Voices

</mag>

</mags>

用上面的程序输出的结果如下:

<mags>

<mag>

</mag>

<mag>

</mag>

</mags>

 子节点的缩进量是根据阅读器的深度属性(Depth属性)设置的,Depth属性返回一个整形的数据,它表示当前节点的嵌套层次。所有文本都放在StringWriter对象中(一个非常方便的基于流的封装了StrigBuilder类的类)。

  如前所述,阅读器不会自动通过Read方法访问属性节点。要访问当前元素的属性节点集合,必须用一个简单的用MoveToNextAttribute方法的返回值控制的循环去遍历该集合。下面的代码用于访问当前节点的所有属性,并把属性的名称和它的值用逗号分开组合成一个字符串:

if (reader.HasAttributes)

while(reader.MoveToNextAttribute())

buf += reader.Name + "=/"" + reader.Value + "/",";

reader.MoveToElement();

当你完成对属性集的处理时,调用MoveToElement方法使指针返回到属性所属的元素节点。准确的说,MoveToElement方法并不是真正的移动指针,因为在处理属性集时指针从来就没有从元素节点中移开。MoveToElement方法只不过指向某个内部成员,并依次取得成员的值。例如,用Name属性获得某个属性的属性名,然后调用MoveToElement方法把指针移到其所属的元素节点处。但是当你不需要继续处理别的节点时,就不必再调用MoveToElement方法了。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值