我将一个表用DataTable.WriteXml()方法写入指定的xml文件之后,再用DataTable.ReadXml()方法读取数据时发生"DataTable 不支持来自 XML 的架构推断。"这个错误,请前辈们帮忙解决!

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleApplication21
    {
        class Program
        {
            static void Main(string[] args)
            {
                System.Data.DataTable dt = new System.Data.DataTable("datatable");
                dt.Columns.Add("aa",typeof(string));
                System.Data.DataRow dRow = dt.NewRow();
                dRow["aa"] = "test";
                dt.Rows.Add(dRow);
                dt.WriteXml(@"c:\dt.xml", System.Data.XmlWriteMode.WriteSchema);            System.Data.DataTable dt2 = new System.Data.DataTable("datatable");
                dt2.ReadXml(@"c:\dt.xml");        }    }
    }
      

  2.   

    为什么我不能修改自己发的帖子呢?
    完善出错代码
                 XmlDocument xmlDoc = new XmlDocument();
                 xmlDoc.Load(xmlname);
                 XmlNode root = xmlDoc.SelectSingleNode("DocumentElement");//查找<DocumentElement>
                 XmlNodeList nodeList = xmlDoc.SelectSingleNode("DocumentElement").ChildNodes;//获取bookstore节点的所有子节点
                 Boolean isuplog = false;
                 #region 更新
                 foreach (XmlNode xn in nodeList)//遍历所有子节点
                 {
                    XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
                    if (xe.GetAttribute("user") == struser)// 
                    {
                       XmlNodeList nls = xe.ChildNodes;//
                       foreach (XmlNode xn1 in nls)//遍历
                       {
                          XmlElement xe2 = (XmlElement)xn1;//转换类型                     
                          if (xe2.Name == "objjc")//如果找到
                          {
                             xe2.InnerText = txtpckey.Text ;//则修改                             
                             break;//找到退出来就可以了
                          }
                       }
                       isuplog = true;
                       break;
                    }
                 }
                 #endregion
                 #region 添加
                 if (isuplog == false)
                 {
                    XmlElement xe1 = xmlDoc.CreateElement("loginuser");//创建一个<loginuser>节点
                    xe1.SetAttribute("user", struser);//设置该节点genre属性
                    XmlElement xesub0 = xmlDoc.CreateElement("user");
                    xesub0.InnerText = struser;//设置文本节点
                    xe1.AppendChild(xesub0);//添加到<book>节点中
                    XmlElement xesub1 = xmlDoc.CreateElement("memo");
                    xesub1.InnerText = "";//设置文本节点
                    xe1.AppendChild(xesub1);//添加到<book>节点中
                    XmlElement xesub2 = xmlDoc.CreateElement("objjc");
                    xesub2.InnerText = txtpckey.Text;//设置文本节点
                    xe1.AppendChild(xesub2);//添加到<book>节点中
                    XmlElement xesub3 = xmlDoc.CreateElement("objtime");
                    xesub3.InnerText = DateTime.Now.ToString();//设置文本节点
                    xe1.AppendChild(xesub3);//添加到<book>节点中                root.AppendChild(xe1);//添加到<bookstore>节点中             }
                 #endregion
                 xmlDoc.Save(xmlname);
    mydtxml = new DataTable();
                 mydtxml.ReadXml(xmlname);
      

  3.   

    datatable必须按照datatable支持的格式来读取xml文档,不是你随便想怎么保存就怎么保存
      

  4.   

    请楼主用DataSet,单个DataTable不是很严格的XML,如果你用DataSet,估计就没这个问题了。
      

  5.   

    用datset也不行 !报错 xml文档如下
    <?xml version="1.0" standalone="yes"?>
    <DocumentElement>
      <loginuser user="admin">
        <user>admin</user>
        <memo>
        </memo>
        <objjc>KQ6KPNCQAAVCDHM445F87DY0C42WWLBK2UVP</objjc>
        <objtime>2008-5-23 14:48:52</objtime>
      </loginuser>
      <loginuser user="xlh001">
        <user>xlh001</user>
        <memo>
        </memo>
        <objjc>FT4FVAUWWPWP8N7CBEDKE94U3UU7YBYKC0LA</objjc>
        <objtime>2008-5-23 16:36:45</objtime>
      </loginuser>
    </DocumentElement>
      

  6.   

    你还是先看看dataset和datatable他们writexml出来的结构什么样子的吧,不是你随便定义一个.net就能认识的.
      

  7.   

    重新启动程序加载没有错误!xml是没有问题!
      

  8.   

     <loginuser user="admin"> 
        <user>admin </user> 
    你定义两个user,叫别个怎么去识别?
      

  9.   

    按照这样的方式使用DataSet,我包装成了两个方法/// <summary>
    /// 将一个DataTable以xml方式存入指定的文件中
    /// </summary>
    /// <param name="dt"></param>
    /// <param name="filePath"></param>
    public static void SaveDataTableToXml(DataTable dt, string filePath)
    {
    //创建文件夹
    if (!Directory.Exists(Path.GetDirectoryName(filePath)))
    {
    Directory.CreateDirectory(Path.GetDirectoryName(filePath));
    } DataSet ds = new DataSet();
    ds.Tables.Add(dt);
    ds.WriteXml(filePath);
    } /// <summary>
    /// 从一个指定的文件中读取DataTable
    /// </summary>
    /// <param name="filePath"></param>
    public static DataTable ReadDataTableFromXml(string filePath)
    {
    DataSet ds = new DataSet();
    ds.ReadXml(filePath);
    if (ds.Tables.Count > 0)
    {
    return ds.Tables[0];
    }
    else
    {
    return null;
    }
    }