当前位置:编程学习 > C#/ASP.NET >>

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();

 }
}


。。。 --------------------编程问答--------------------
引用 6 楼 chazikai24 的回复:
C# code
XmlNodeList nodelist = root.SelectNodes("//Form[Name='" + frmName + "']/Controls/Control");

你试试看,不知道行不行。我自己用过的没有后面的两个/Control的


恩,发现原因了,是少了一对 ''
谢谢你了 --------------------编程问答--------------------
引用 6 楼 chazikai24 的回复:
C# code
XmlNodeList nodelist = root.SelectNodes("//Form[Name='" + frmName + "']/Controls/Control");

你试试看,不知道行不行。我自己用过的没有后面的两个/Control的


对了,再问你一个问题啊,就是每当我运行程序修改xml文件结束后,当结束程序后总弹出一个对话框说:
该文件已经在编译器之外修改,是否需要重新加载它?

问一下怎么才不让程序总弹出这个对话框啊?谢谢了。 --------------------编程问答--------------------

        
--------------------编程问答--------------------

            
        
--------------------编程问答--------------------

            
引用 9 楼 zy25731066 的回复:
引用 6 楼 chazikai24 的回复:
C# code
XmlNodeList nodelist = root.SelectNodes("//Form[Name='" + frmName + "']/Controls/Control");

你试试看,不知道行不行。我自己用过的没有后面的两个/Control的


对了,再问你一个问题啊,就是每当我运行程序修改xml文件结束后,……


这个是vss弹出来的,因为你vss中打开的xml文档和你修改之后的不一样了,一个提醒而已 --------------------编程问答-------------------- 学习来了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,