本笔记计划总结XMLDocument方式读取XML文件并与readXML 方式进行对比
功能需求:
提供路线表,包含路线及路线内站台信息。提供实际得到的路线及站台号信息,核对该站台号是否在该路线中(以路线表为标准)
需求分析:
先用XmlDocument读取路线信息,建立树结构。用提供的路线循环对比树结构中的路线节点,找到后再用提供的站台信息循环对比树结构中该路线节点下的站台子节点
能够找到判定为合法站台号,找不到判定为非法站台号
具体实现:
路线表信息
<?xml version="1.0" encoding="UTF-8" ?>
<AAAAAA>
<Header File_Name="ROUTE" File_Version="004" File_Format="05" />
<Routes>
<Route ID="1" Route_Name="XXXX" Route_Code="XXXXXXXX">
<Route_Fare Fare1="FF" Fare2="FF" />
<Stops>
<Stop ID="1" Stop_Name="XXXXX" Stop_Code="XXXXXX" />
<Stop ID="2" Stop_Name="XXXXX" Stop_Code="XXXXXX" />
<!--... 可增加,结构同上 -->
</Stops>
</Route>
<Route ID="2" Route_Name="XXXX" Route_Code="XXXXXXXX">
<Route_Fare Fare1="FF" Fare2="FF" />
<Stops>
<Stop ID="1" Stop_Name="XXXXX" Stop_Code="XXXXXX" />
<!--... 可增加,结构同上 -->
</Stops>
</Route>
<!--... 可增加,结构同上-->
</Routes>
</AAAAAA>
读路线表建立树结构
XmlDocument readXml = new XmlDocument();
readXml.Load(routeFilePath + @"\Route.xml");
读取路线节点信息
routeNodeList = readXml.SelectSingleNode("/AAAAAA/Routes").ChildNodes;
循环对比路线节点
foreach (XmlNode routeNode in routeNodeList)
{
XmlElement routeElement = (XmlElement)routeNode;
if (routeElement.GetAttribute("Route_Code") == routeCode)
{
}
}
找到路线后循环对比站台号
XmlNodeList stopNodeList = routeElement.SelectSingleNode("Stops").ChildNodes;
foreach (XmlNode stopNode in stopNodeList)
{
XmlElement stopElement = (XmlElement)stopNode;
if (stopElement.GetAttribute("Stop_Code").Substring(2,4) == rfidNo.Substring(2,4))
{
return true;
}
}
需求搞定。
用到的知识点:
XmlDocument 声明并初始化
XmlDocument readXml = new XmlDocument();
读取数据readXml.Load(routeFilePath + @"\Route.xml");
查找节点并存储在XmlNodeList类型的routeNodeList中
routeNodeList = readXml.SelectSingleNode("/AAAAAA/Routes").ChildNodes;
用到SelectSingleNode方法,选择匹配 "/AAAAAA/Routes") 表达式的第一个 XmlNode
XmlNode.ChildNodes方法得到子节点列
XmlElement routeElement = (XmlElement)routeNode;将节点转换为元素类型
routeElement.GetAttribute("Route_Code")得到Route中属性Route_Code的值
完整代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace BuActionExplain
{
public class CheckRoute
{
public XmlNodeList routeNodeList;
public CheckRoute(string routeFilePath)
{
XmlDocument readXml = new XmlDocument();
readXml.Load(routeFilePath + @"\Route.xml");
routeNodeList = readXml.SelectSingleNode("/AAAAAA/Routes").ChildNodes;
}
public bool SelectRFID(XmlNodeList routeNodeList,string routeCode, string rfidNo)
{
foreach (XmlNode routeNode in routeNodeList)
{
XmlElement routeElement = (XmlElement)routeNode;
if (routeElement.GetAttribute("Route_Code") == routeCode)
{
XmlNodeList stopNodeList = routeElement.SelectSingleNode("Stops").ChildNodes;
foreach (XmlNode stopNode in stopNodeList)
{
XmlElement stopElement = (XmlElement)stopNode;
if (stopElement.GetAttribute("Stop_Code").Substring(2,4) == rfidNo.Substring(2,4))
{
return true;
}
}
}
}
return false;
}
}
}
开始时不知道还有XmlDocument这个东西,想用DataSet中的ReadXml方法,上网查找后发现XmlDocument方法最简洁有效。
应为如果用DataSet中的ReadXml方法,将会读出6个表,而路线表和站台号表还要建立关联什么的,很复杂。
综上,XmlDocument这个东西很好用
最近又学到了类似的东东还有:
XMLTextReader------提供以快速、单向、无缓冲的方式存取XML数据。(单向意味着你只能从前往后读取XML文件,而不能逆向读取)
XMLValidatingReader------与XMLTextReader类一起使用,提供验证DTD、XDR和XSD架构的能力。
XMLDocument------遵循W3C文档对象模型规范的一级和二级标准,实现XML数据随机的、有缓存的存取。一级水平包含了DOM的最基本的部分,而二级水平增加多种改进,包括增加了对名称空间和级连状图表(css)的支持。
XMLTextWriter------生成遵循 W3C XML 1.0 规范的XML文件。
信息来自于:
http://www.cnblogs.com/goody9807/archive/2006/10/24/534888.html
文章说XMLTextReader对资源要求更小,没仔细研究,先记下来。