datatable datasource(string xmlfile)
{dataset objds = new dataset();
//假设xml文件放在app_data目录下
objds.readxml(httpcontext.current.server.mappath("~/app_data/" + xmlfile));
return objds.tables[0];
}
string getfeildtext(datatable dt, string condition, string outputfieldtext)
{
string result = string.empty;
datarow[] row = dt.select(condition);
if (row.length > 0)
result = row[0][outputfieldtext].tostring();
return result;
}
//假设需求是:根据id找name
string getsexname(string id)
{
string condition = "id= '" + id+ "'";
return getfeildtext(datasource(), condition, "name");
}
下面的代码将使用xmltextreader对象将磁盘文件中的数据读取到xmldocument对象中。xmltextreader对象在功能上和streamreader及binaryreader对象十分相似,只不过它是专为读取xml文件而特别设计的。除此以外,xmltextreader对象还有其他一些与xml相关的特性。例如,代码中使用到的whitespacehandling属性告诉应用程序不要为xml文件中多余的空格建立节点。
下面的代码使用xmltextreader对象的documentelement属性来查找xml文档的树状表达形式的根节点。之后,递归地调用addwithchildren方法将将节点及它的子节点一同添加到listbox中。
下面的代码还包含了属性的处理。属性节点并不包含在一个xmldocument对象的节点的子节点集合中。因而,你只能使用xmlnode对象的attributes属性获得属性节点集合。获取了属性节点集合后,代码使用xmlnamednodemap对象来保存这个集合。这个对象能够保存任何类型的xmlnode对象的任何集合。
代码列表
private void btnload_click(object sender, system.eventargs e)
{
xmltextreader reader = new xmltextreader(
server.mappath("mycompany.xml"));
reader.whitespacehandling = whitespacehandling.none;
xmldocument xmldoc = new xmldocument();
//将文件加载到xmldocument对象中
xmldoc.load(reader);
//关闭连接
reader.close();
//向listbox中添加代表文档的元素
lbnodes.items.add("xml document");
//查找根节点,并将它及它的子节点一同添加到listbox中
xmlnode xnod = xmldoc.documentelement;
addwithchildren(xnod,1);
}
private void addwithchildren(xmlnode xnod, int32 intlevel)
{
//将节点及它的子节点一同添加到listbox中
//intlevel 控制缩进的深度
xmlnode xnodworking;
string strindent = new string(' ',2 * intlevel);
//如果节点有值,读取它的值
string strvalue = (string) xnod.value;
if(strvalue != null)
{
strvalue = " : " + strvalue;
}
//将节点的详细信息添加到listbox中
lbnodes.items.add(strindent + xnod.name + strvalue);
//如果是元素节点,获取它的属性
if (xnod.nodetype == xmlnodetype.element)
{
xmlnamednodemap mapattributes = xnod.attributes;
//将节点属性添加到listbox中
foreach(xmlnode xnodattribute in mapattributes)
{
lbnodes.items.add(strindent + " " + xnodattribute.name +
" : " + xnodattribute.value);
}
//如果还有子节点,就递归地调用这个程序
if(xnod.haschildnodes)
{
xnodworking = xnod.firstchild;
while (xnodworking != null)
{
addwithchildren(xnodworking, intlevel +1);
xnodworking = xnodworking.nextsibling;
}
}
}
}
}