扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:陶刚编译 来源:yesky 2007年11月16日
关键字:
System::Void btnParse_Click(System::Object * sender, System::EventArgs * e) { XmlTextReader* DataRead; // 载入数据以供读取 StringBuilder* Output; // 分析后的输出信息 // 打开文件以读取头 DataRead = new XmlTextReader(txtFilename->Text); // 初始化输出 Output = new StringBuilder(); // 继续读取头节点直到完成 while (DataRead->Read()) { // 得到每个节点的信息 Output->Append(ProcessEntry(DataRead)); Output->Append("\r\n"); } // 显示结果 MessageBox::Show(Output->ToString(), "XML Parsing Results", MessageBoxButtons::OK, MessageBoxIcon::Information); // 关闭文档 DataRead->Close(); } |
当代码通过建立新的XmlTextReader打开文档的时候这个过程就开始了。打开XmlTextReader的时候把文件的指针放在文件的开头了。你必须执行一些其它的事务(例如使用上面显示的Read()方法)来得到第一个节点。如果你试图执行这个过程而没有使用Read()或其它的可以接受的方法,应用程序会产生空(null)引用的错误。
示例通过调用ProcessEntry()方法(列表4所示)每次处理一个节点。它把节点的数据追加到StringBuilder对象(Output)。Read()方法一直返回true,直到测试程序处理了文件中的所有节点。这个时候,处理循环结束,示例调用Close()方法关闭文件。你需要确保执行了最后一步。
ProcessEntry()方法执行这个过程的第二步:从单个节点中得到数据(如列表4所示),这个方法检索你需要处理的数据的通用信息。
列表4.XML文件分析细节信息
StringBuilder* ProcessEntry(XmlTextReader* Reader) { StringBuilder* DataOut; // 得到输出 // 初始化输出 DataOut = new StringBuilder(); // 检测节点类型 switch (Reader->NodeType) { case XmlNodeType::Attribute: DataOut->Append("Attribute"); break; // ...处理其它类型... case XmlNodeType::XmlDeclaration: DataOut->Append("XML Declaration"); break; default: DataOut->Append("Type Unknown"); } // 添加元素名称 DataOut->Append("\t"); DataOut->Append(Reader->Name); // 添加元素的值 if (Reader->HasValue) { DataOut->Append("\t"); DataOut->Append(Reader->Value); } // 添加属性 if (Reader->HasAttributes) for (Int32 Counter = 0; Counter < Reader->AttributeCount; Counter++) { Reader->MoveToAttribute(Counter); DataOut->Append("\r\n\t"); DataOut->Append(Counter); DataOut->Append("\t"); DataOut->Append(Reader->Name); DataOut->Append("\t"); DataOut->Append(Reader->Value); } // 返回结果 return DataOut; } |
ProcessEntry()方法从通过使用NodeType属性检测节点的类型开始。示例输出一个标识节点类型的字符串,但是作为产品的应用程序通常使用节点类型定义处理操作或检测它是否需要执行处理过程。在这种情况下,示例建立DataOut StringBuilder对象来保持节点类型信息。
每个节点都有名称,因此下面的文本把Name属性值添加到DataOut。名称值可以由你指定(例如图1中的DataString1),或者由.NET框架组件指定默认值。例如,注释没有准确的名称,因此.NET框架组件赋予它的名字是Comment。
大多数节点也有值。但是,你必须使用HasValue属性检验当前节点是否有值。如果示例检测到了当前节点的值,它就把节点的Value属性添加到DataOut。
有些节点也有属性。但是,在使用HasAttributes属性检查他们之前,你必须检查他们的属性。AttributeCount属性表明了某个节点有多少个属性(可以多于一个)。这是一个零值为基础的值。示例使用MoveToAttribute()方法把当前属性载入读取程序。接着代码就可以正常使用Name和Value属性了。
请注意:你不必执行详细的属性处理。如果你需要的是属性值,使用方Reader->GetAttribute()法就可以了,该方法仅仅返回所有属性的值并能节省少量处理步骤。但是,一般情况下你需要同时知道属性的名称和值,因此列表4中的处理技术比你现在使用的其它技术更加通用。图2显示了这个程序的典型输出信息。
图2.分析XML文件意味着检索单独的值
注意:图2中显示了少量你可能没有估计到的信息。例如,XML头中的信息(类似版本号),对.NET框架组件来说它是作为属性出现的。示例代码也包含了列表1中的清单文件的副本。你可以在Filename字段中输入这个文件的路径和名称。应用程序分析这个文件与它分析自己生成的XML文件的容易程度是一样的。实际上,这个应用程序可以处理任何良好格式化的XML文件。
总结
现在你已经知道了.NET中使用XML文件是多么容易了。读取和写入XML文件并不比处理一个典型的文本文件复杂。此外,你可能发现了少量以前没有考虑过的XML的新的用法。随着微软把对XML的支持添加到更多的产品中,你可以确性在.NET中分析XML的简便性将使你的开发工作更加容易。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者