目录
可以通过使用哈希表可以对XML文件进行查询。
一、使用的方法
1.Hashtable哈希表
Hashtable通常称为哈希表,它表示键/值对的集合,这些键/值对根据键的哈希代码进行组织,它的每个元素都是一个存储于DictionaryEntry对象中的键/值对。
注意:Hashtable哈希表中的键不能为空引用,但值可以。
2.Hashtable哈希表的Add方法
(1)定义
Hashtable哈希表的Add方法用来将带有指定键和值的元素添加到Hashtable哈希表中。
cs
public virtual void Add (object key, object? value);
参数
key Object
要添加的元素的键。
value Object
要添加的元素的值。 该值可以为 null。
实现
Add(Object, Object)
例外
ArgumentNullException
key 为 null。
ArgumentException
Hashtable 中已存在具有相同键的元素。
NotSupportedException
Hashtable 为只读。
- 或 -
Hashtable 具有固定的大小。
(2)示例
cs
// Hashtable.Add(Object, Object) 方法
using System.Collections;
namespace _107_1
{
public class SamplesHashtable
{
public static void Main()
{
// Creates and initializes a new Hashtable.
var myhash = new Hashtable//集合方法
{
{ "one", "The" },
{ "two", "quick" },
{ "three", "brown" },
{ "four", "fox" }
};
//等效语句,Add方法
//var myhash = new Hashtable();
//myhash.Add("one", "The");
//myhash.Add("two", "quick");
//myhash.Add("three", "brown");
//myhash.Add("four", "fox");
// Displays the Hashtable.
Console.WriteLine("The Hashtable contains the following:");
PrintKeysAndValues(myhash);
}
public static void PrintKeysAndValues(Hashtable myhash)
{
Console.WriteLine("\t-KEY-\t-VALUE-");
foreach (DictionaryEntry de in myhash)
Console.WriteLine($"\t{de.Key}:\t{de.Value}");
}
}
}
/*
运行效果:
The Hashtable contains the following:
-KEY- -VALUE-
three: brown
four: fox
two: quick
one: The
*/
3.XML文件的使用
XML是eXtensible Markup Language的缩写,它是一种类似于HTML的标记语言。XML以简易而标准的方式保存各种信息(如文字和数字等信息),适用于不同应用程序间的数据交换,而这种交换不以预先定义的一组数据结构为前提,增强了可扩展性。
二、实例
1.源码
cs
// 用哈希表查询XML文件
using System.Collections;
using System.Xml;
namespace _107
{
public partial class Form1 : Form
{
private Label? label1;
private Label? label2;
static ComboBox? comboBox1;
static ComboBox? comboBox2;
public Form1()
{
InitializeComponent();
StartPosition = FormStartPosition.CenterScreen;
Load += Form1_Load;
}
private void Form1_Load(object? sender, EventArgs e)
{
//
// label1
//
label1 = new Label
{
AutoSize = true,
Location = new Point(12, 21),
Name = "label1",
Size = new Size(68, 17),
TabIndex = 0,
Text = "电台名称:"
};
//
// label2
//
label2 = new Label
{
AutoSize = true,
Location = new Point(12, 52),
Name = "label2",
Size = new Size(68, 17),
TabIndex = 1,
Text = "电台网址:"
};
//
// comboBox1
//
comboBox1 = new ComboBox
{
FormattingEnabled = true,
Location = new Point(77, 13),
Name = "comboBox1",
Size = new Size(195, 25),
TabIndex = 2
};
//
// comboBox2
//
comboBox2 = new ComboBox
{
FormattingEnabled = true,
Location = new Point(77, 44),
Name = "comboBox2",
Size = new Size(195, 25),
TabIndex = 3
};
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(284, 81);
Controls.Add(comboBox2);
Controls.Add(comboBox1);
Controls.Add(label2);
Controls.Add(label1);
Name = "Form1";
Text = "用哈希表查询XML文件";
Myhash();
}
static void Myhash()
{
Hashtable myHashtable = SelectXML("BroadCastInfo.xml"); //使用自定义方法实例化哈希表对象
IDictionaryEnumerator IDEnumerator = myHashtable.GetEnumerator();
while (IDEnumerator.MoveNext()) //循环访问哈希表
{
comboBox1!.Items.Add(IDEnumerator.Value!.ToString()!); //显示电台名称
comboBox2!.Items.Add(IDEnumerator.Key.ToString()!); //显示电台网址
}
comboBox1!.SelectedIndex = comboBox2!.SelectedIndex = 0; //设置默认选项
}
#region 在XML文件中查找电台地址及名称
/// <summary>
/// 在XML文件中查找电台地址及名称,BCastInfo文件存储于启动目录
/// </summary>
/// <param name="strPath">XML文件路径</param>
/// <returns>Hashtable对象,用来记录找到的电台地址及名称</returns>
static Hashtable SelectXML(string strPath)
{
Hashtable HTable = []; //实例化哈希表对象
XmlDocument doc = new();//实例化XML文档对象
doc.Load(strPath); //加载XML文档
XmlNodeList xnl = doc.SelectSingleNode("BCastInfo")!.ChildNodes;//获取NewDataSet节点的所有子节点
string strVersion = ""; //定义一个字符串,用来记录电台地址
string strInfo = ""; //定义一个字符串,用来记录电台名称
foreach (XmlNode xn in xnl) //遍历所有子节点
{
XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
if (xe.Name == "DInfo") //判断节点名为DInfo
{
XmlNodeList xnlChild = xe.ChildNodes; //继续获取xe子节点的所有子节点
foreach (XmlNode xnChild in xnlChild) //遍历
{
XmlElement xeChild = (XmlElement)xnChild;//转换类型
if (xeChild.Name == "Address")
{
strVersion = xeChild.InnerText; //记录电台地址
}
if (xeChild.Name == "Name")
{
strInfo = xeChild.InnerText; //记录电台名称
}
}
HTable.Add(strVersion, strInfo); //向哈希表中添加键值
}
}
return HTable;
}
#endregion
}
}