Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取数据表中的XML数据和模式_C#_Xml_Ado.net_Datatable - Fatal编程技术网

C# 读取数据表中的XML数据和模式

C# 读取数据表中的XML数据和模式,c#,xml,ado.net,datatable,C#,Xml,Ado.net,Datatable,我有两条线。一个字符串具有XML数据,另一个字符串具有相应的XML模式。我正在尝试读取DataTable中的数据。看来这是不可能的。我不想使用数据集。有没有办法将XML数据和模式组合到内存流中并读取?简单地说,没有办法通过DataTable上的方法将XML直接加载到DataTable中,也没有办法直接从任意模式创建DataTable。这些操作必须通过数据集完成;否则,您最终会执行一些非常复杂的变通方法 使用xml序列化可以应用一些技术,这些技术可以从以前序列化的xml重新创建数据集。但这不允许使

我有两条线。一个字符串具有XML数据,另一个字符串具有相应的XML模式。我正在尝试读取DataTable中的数据。看来这是不可能的。我不想使用数据集。有没有办法将XML数据和模式组合到内存流中并读取?

简单地说,没有办法通过DataTable上的方法将XML直接加载到DataTable中,也没有办法直接从任意模式创建DataTable。这些操作必须通过数据集完成;否则,您最终会执行一些非常复杂的变通方法

使用xml序列化可以应用一些技术,这些技术可以从以前序列化的xml重新创建数据集。但这不允许使用任意模式

您还可以编写专门加载XML(通过XDocument、XmlDocument或XmlTextReader)并动态创建DataTable的代码,但编写这些代码并不是件小事,可能会花费您相当长的时间。这也是对轮子的一种改造

本质上,DataSet是该层次结构中唯一一个具有处理XML方法的类,因为XML可以包含任意数量的表。要处理几乎不需要对XML进行任何假设的最广泛的情况,必须在该级别实现它

您还可以考虑将XML简单加载到XOffice中,使用扩展方法验证它,并使用LINQtoXML来查询它。 有没有一种方法可以将XML数据和模式组合到内存中 流媒体和阅读


方法

     static DataTable ParseXML(string xmlString)
     {
         DataSet ds = new DataSet();
         byte[] xmlBytes = Encoding.UTF8.GetBytes(xmlString);
         Stream memory = new MemoryStream(xmlBytes);
         ds.ReadXml(memory);
         return ds.Tables[0];
     }

示例:

            string xml = new XElement("inventory",
                new XElement("item",
                    new XElement("name", "rock"),
                    new XElement("price", "5000")),
                new XElement("item",
                    new XElement("name", "new car"),
                    new XElement("price", "1"))).ToString();

            DataTable dt = ParseXML(xml);
            foreach (DataRow row in dt.Rows)
            {
                foreach (DataColumn col in dt.Columns)
                    Console.Write(row[col.ColumnName] + " | ");

                Console.WriteLine();
            }

DaraTable/Dataset只理解它们自己的模式,而不是您带来的模式。在没有架构的情况下尝试。看起来DataSet能够在没有架构的情况下读取数据。但是当我尝试使用datatable时,我得到了以下错误。Datatable不支持从xml进行模式推断。“数据集能够读取数据”-那么,问题解决了吗?@Henk,是的,问题解决了。但我不打算使用数据集。否则,我应该能够解释为什么datatable无法读取XML数据。XML文件可以包含多个“表”,因此数据集是解析它的主要类是有意义的。但为什么“不使用数据集”??毫无意义。