doc.LoadXml("<myxml></myxml>");
            XmlNode root = doc.SelectSingleNode("myxml");
            foreach (TreeNode tn in treeView1.Nodes)
            {
                XmlElement Test = doc.CreateElement(tn.Name);
                root.AppendChild(Test);
                if (tn.Nodes != null)
                {
                    ChildNods(tn, Test);
                }
            }
            doc.Save("myxml.xml");到XmlElement Test = doc.CreateElement(tn.Name);运行不了。
谁能告诉我为什么啊?“System.ArgumentException”类型的未经处理的异常出现在 System.Xml.dll 中。其他信息: 元素或特性的本地名称不能为空或空字符串。
C#  窗口应用程序设计  使用vs2010

解决方案 »

  1.   

    xml元素的名称不能为空,应该是你的tn.Name等于null或者等于空字符串,要不然你改成下面这样:foreach (TreeNode tn in treeView1.Nodes)
       {
       string strName=tn.Name;
       if (String.IsNullOrEmpty(strName))
       {
          strName="NoName";
       }
       XmlElement Test = doc.CreateElement(strName);
       root.AppendChild(Test);
       if (tn.Nodes != null)
       {
       ChildNods(tn, Test);
       }
       }
     
    判断一下tn.Name是否为空,如果空给它一个缺省的非空名字,这样就不会出错了,
      

  2.   

    这样倒是吧问题找到了,无法保存xml文件的第二个节点名,例如:
    <myxml>
     &nbsp<第一学期>
    &nbsp&nbsp<123 />
    &nbsp</第一学期>
    <myxml>
    无法保存第一学期这个节点名:这个该怎么解决啊?
      

  3.   

    处理树形结构应该用递归,不知道你的ChildNods是怎么写的,ChildNods应该是一个递归的方法,而且应该传入doc,以便其内部可以创建新的节点,
      

  4.   


    private void ChildNods(TreeNode ParentNode, XmlElement Test)
            {
                foreach (TreeNode tn in ParentNode.Nodes)
                {
                    XmlElement Ts = doc.CreateElement(tn.Text);
                    Test.AppendChild(Ts);
                    if (tn.Nodes != null)
                    {
                        ChildNods(tn, Ts);
                    }
                }
            }
    就是不能保存节点,改成你的代码时,树的最外层节点名为NoName!
      

  5.   

    你应该递归了,不过很奇怪,你没有传入doc,ChildNodes里面的doc是哪来的?难道是全局变量?
      

  6.   


    对doc是全局变量: 
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            string filename;
            string filenames;
            int q = 0;
            XmlDocument doc = new XmlDocument();
      

  7.   

    你可以在ChildNods内部设置断点,然后一步一步跟踪看看,为什么有些节点没有写入xml文件,
      

  8.   

    非常感谢找到原因了,
    foreach (TreeNode tn in treeView1.Nodes)
      {
      string strName=tn.Name;
      if (String.IsNullOrEmpty(strName))
      {
      strName="NoName";
      }
      XmlElement Test = doc.CreateElement(strName);
      root.AppendChild(Test);
      if (tn.Nodes != null)
      {
      ChildNods(tn, Test);
      }
      }
    将string strName=tn.Name;改为string strName=tn.Text就行了。
    非常感谢你!