C#中读取xml文件时遇到的问题。
我做的是多语言版本的软件,所以需要再xml中读取不同语言的数据,但遇到了麻烦。比如一个xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<Resource>
<Form>
<Name>F_test</Name>
<Controls>
<Control name="F_test" text="Hello" />
<Control name="文件ToolStripMenuItem" text="File" />
<Control name="开始ToolStripMenuItem" text="Start" />
<Control name="button1" text="Button" />
</Controls>
</Form>
</Resource>
然后用一个函数去读取他
/// <summary>
/// 获取控件的名称
/// </summary>
/// <param name="form"></param>
public static void getNames(Form form)
{
//根据用户选择的语言获得表的显示文字
Hashtable table;
table = ReadResource(form.Name, "EN"); //AppConfig.在哪里
MessageBox.Show(form.Name);
Control.ControlCollection controlNames = form.Controls;
//可以在这里设置窗体的一些统一的属性,这样所有的窗体都会应用该设置
// form.KeyPreview = true;
// form.MaximizeBox = false;
// form.MinimizeBox = false;
// form.ControlBox = false;
// form.FormBorderStyle = FormBorderStyle.FixedDialog;
// form.StartPosition = FormStartPosition.CenterScreen;
// form.TopMost = true;
// form.KeyDown += new KeyEventHandler(OnEnter);
try
{
foreach (Control control in controlNames)
{
if (control.GetType() == typeof(System.Windows.Forms.Panel))
GetSubControls(control.Controls, table);
if (control.GetType() == typeof(System.Windows.Forms.GroupBox))
GetSubControls(control.Controls, table);
if (control.GetType() == typeof(System.Windows.Forms.MenuStrip))
GetSubControls(control.Controls, table);
// if(control.GetType() == typeof(System.Windows.Forms.TextBox) && control.Enabled)
// control.GotFocus += new EventHandler(Txt_Focus);
if (table.Contains(control.Name.ToLower()))
control.Text = (string)table[control.Name.ToLower()];
}
if (table.Contains(form.Name.ToLower()))
form.Text = (string)table[form.Name.ToLower()];
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
其中里面调用的函数:ReadResource如下
/// <summary>
/// 读取多语言的资源文件
/// </summary>
/// <param name="frmName">窗体的Name</param>
/// <param name="lang">要显示的语言(如ZH或EN)</param>
/// <returns></returns>
public static Hashtable ReadResource(string frmName, string lang)
{
Hashtable result = new Hashtable();
XmlReader reader = null;
FileInfo fi = new FileInfo("resources/AppResource_" + lang + ".xml");
if (!fi.Exists)
reader = new XmlTextReader("resources/AppResource.xml");
else
reader = new XmlTextReader("resources/AppResource_" + lang + ".xml");
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode root = doc.DocumentElement;
XmlNodeList nodelist = root.SelectNodes("Form[Name=" + frmName + "]/Controls/Control");
foreach (XmlNode node in nodelist)
{
try
{
XmlNode node1 = node.SelectSingleNode("@name");
XmlNode node2 = node.SelectSingleNode("@text");
if (node1 != null)
{
result.Add(node1.InnerText.ToLower(), node2.InnerText);
}
}
catch (FormatException fe)
{
Console.WriteLine(fe.ToString());
}
}
reader.Close();
return result;
}
在ReadResource中经过断点跟踪,发现nodelist没有得到值,也就是进不去foreach中,然后我怀疑是获得nodelist的selectNodes中的语句好像有问题,但不知道哪里错了,希望高手帮忙解决,谢谢大家了。 --------------------编程问答-------------------- --------------------编程问答-------------------- 下面的贴子解决了 XML 数据文件的全方位操作问题:
http://topic.csdn.net/u/20100805/10/84a98851-325f-4f5d-9230-6581eacc9c72.html --------------------编程问答-------------------- 下次发帖LZ最好用代码形式发,这样我们看起来太累,这么长,谁帮你来看啊? --------------------编程问答-------------------- 能改成代码形式的不?我新手一个。。。
--------------------编程问答-------------------- 发帖的时候工具栏有一个插入代码,选c#,代码写在两个[]中间啊 --------------------编程问答--------------------
XmlNodeList nodelist = root.SelectNodes("//Form[Name='" + frmName + "']/Controls/Control");
你试试看,不知道行不行。我自己用过的没有后面的两个/Control的 --------------------编程问答--------------------
XmlNode root = doc.SelectSingleNode("Resource/Form/Control");
if (root.HasChildNodes)
{
XmlNodeList nodelist = root.ChildNodes;
foreach (XmlNode node in nodelist)
{
try
{
//属性 -- 大小写一致
string name = node.Attribute["name"].Value.ToString().Trim();
string text = node.Attribute["text"].Value.ToString().Trim();
}
}
。。。 --------------------编程问答--------------------
恩,发现原因了,是少了一对 ''
谢谢你了 --------------------编程问答--------------------
对了,再问你一个问题啊,就是每当我运行程序修改xml文件结束后,当结束程序后总弹出一个对话框说:
该文件已经在编译器之外修改,是否需要重新加载它?
问一下怎么才不让程序总弹出这个对话框啊?谢谢了。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
这个是vss弹出来的,因为你vss中打开的xml文档和你修改之后的不一样了,一个提醒而已 --------------------编程问答-------------------- 学习来了
补充:.NET技术 , C#