C# 将XML字符串加载到数据表中 string parseData=“1020”; 数据集ds=新数据集(“Whatev”); TextReader txtReader=新的StringReader(解析数据); XmlReader=新的XmlTextReader(TXReader); ReadXml(reader); 数据表ad=新数据表(“newT”); ReadXml(reader);

C# 将XML字符串加载到数据表中 string parseData=“1020”; 数据集ds=新数据集(“Whatev”); TextReader txtReader=新的StringReader(解析数据); XmlReader=新的XmlTextReader(TXReader); ReadXml(reader); 数据表ad=新数据表(“newT”); ReadXml(reader);,c#,visual-studio-2010,datatable,xml-parsing,C#,Visual Studio 2010,Datatable,Xml Parsing,为此,我在ad中得到了空表,在ds中得到了三个表。 我期待的是,, 一个表包含两列A和B,一行包含值10和20 我做错了什么?你只是没有正确地使用它。有很多问题: 您正在从同一条流中读取两次。在第一个过程中,流指针位于流的末尾。当它已经结束时,您尝试再次从中读取,因此不会读取任何其他内容。要么读入数据集,要么读入数据表,而不是两者都读入。或者,如果你真的愿意,至少要回到流的开头 您的XML格式不正确。必须采用以下格式: 列值 另一列值 您将无法对任何任意XML使用该方法 您的表没有架构集。您

为此,我在ad中得到了空表,在ds中得到了三个表。 我期待的是,, 一个表包含两列A和B,一行包含值10和20


我做错了什么?

你只是没有正确地使用它。有很多问题:

  • 您正在从同一条流中读取两次。在第一个过程中,流指针位于流的末尾。当它已经结束时,您尝试再次从中读取,因此不会读取任何其他内容。要么读入数据集,要么读入数据表,而不是两者都读入。或者,如果你真的愿意,至少要回到流的开头

  • 您的XML格式不正确。必须采用以下格式:

    
    列值
    另一列值
    
    您将无法对任何任意XML使用该方法

  • 您的表没有架构集。您需要读入模式或预先设置它

               string parseData= "<TEST xmlns:dt=\"urn:schemas-microsoft-com:datatypes\"><A dt:dt=\"string\">10</A><B dt:dt=\"string\">20</B></TEST>";
    
                DataSet ds = new DataSet("Whatev");
    
                TextReader txtReader = new StringReader(parseData);
                XmlReader reader = new XmlTextReader(txtReader);
                ds.ReadXml(reader);
                DataTable ad = new DataTable("newT");
                ad.ReadXml(reader);
    
  • 请尝试以下方法:

    var table = new DataTable("TEST");
    table.Columns.Add("A", typeof(string));
    table.Columns.Add("B", typeof(string));
    table.ReadXml(xmlReader);
    
    var xmlStr=@”
    10
    20
    ";
    var表=新数据表(“测试”);
    表.Columns.Add(“A”,typeof(string));
    表.Columns.Add(“B”,typeof(string));
    table.ReadXml(新的StringReader(xmlStr));
    

    如果您决定自己解析XML,LINQ可以在这里帮助您

    var xmlStr = @"<Root>
        <TEST>
            <A>10</A>
            <B>20</B>
        </TEST>
    </Root>";
    var table = new DataTable("TEST");
    table.Columns.Add("A", typeof(string));
    table.Columns.Add("B", typeof(string));
    table.ReadXml(new StringReader(xmlStr));
    
    publicstaticdatatable AsDataTable(xelementroot、stringtablename、IDictionary类型映射)
    {
    var table=新数据表(表名);
    //基于第一行设置架构
    XNamespace dt=“urn:schemas-microsoft-com:datatypes”;
    变量列=
    (来自root.Element(tableName.Elements()中的e)
    让typeName=(字符串)e.Element(dt+“dt”)
    让type=typeMapping.ContainsKey(typeName??)?typeMapping[typeName]:typeof(string)
    选择newdatacolumn(e.Name.LocalName,type)).ToArray();
    表.Columns.AddRange(列);
    //添加行
    foreach(root.Elements中的var rowElement(tableName))
    {
    var row=table.NewRow();
    foreach(列中的var列)
    {
    var colElement=rowElement.Element(column.ColumnName);
    if(colElement!=null)
    行[column.ColumnName]=Convert.ChangeType((字符串)colElement,column.DataType);
    }
    table.Rows.Add(行);
    }
    返回表;
    }
    
    然后使用它:

    public static DataTable AsDataTable(XElement root, string tableName, IDictionary<string, Type> typeMapping)
    {
        var table = new DataTable(tableName);
    
        // set up the schema based on the first row
        XNamespace dt = "urn:schemas-microsoft-com:datatypes";
        var columns =
           (from e in root.Element(tableName).Elements()
            let typeName = (string)e.Element(dt + "dt")
            let type = typeMapping.ContainsKey(typeName ?? "") ? typeMapping[typeName] : typeof(string)
            select new DataColumn(e.Name.LocalName, type)).ToArray();
        table.Columns.AddRange(columns);
    
        // add the rows
        foreach (var rowElement in root.Elements(tableName))
        {
            var row = table.NewRow();
            foreach (var column in columns)
            {
                var colElement = rowElement.Element(column.ColumnName);
                if (colElement != null)
                    row[column.ColumnName] = Convert.ChangeType((string)colElement, column.DataType);
            }
            table.Rows.Add(row);
        }
        return table;
    }
    
    var xmlStr=@”
    10
    20
    ";
    var root=XElement.Parse(xmlStr);
    var映射=新字典
    {
    {“string”,typeof(string)},
    };
    var table=AsDataTable(根,“测试”,映射);
    

    可能有更好的方法来获取数据类型的关联.NET类型,但我现在不知道怎么做,如果我发现了,我会更新。

    谢谢@Jeff Mercado的回答。1.我只是想看看什么是最好的阅读方式。所以,我尝试了这两种方法,显然我做错了。谢谢你指出这一点。我试过2和3,效果很好。但是,我唯一的问题是,我没有得到您在3中所示的XML类型。这可能是另一个问题,但什么是解析的最佳方式,string parseData=“1020”;这种xml?我提出了一个新问题。。。你可以采取两种方法。如果要使用
    ReadXml()
    方法,则必须将XML转换为适当的格式并从中生成模式,以便将该模式传递到
    ReadXmlSchema()
    方法中。否则,您可以自己解析XML以加载模式并填充表(LINQ可以提供帮助)。您只是想将该XML加载到表中,还是特别想使用
    ReadXml()
    方法?我只是想将该XML加载到表中。谢谢您的回答,这很有帮助。:)
    var xmlStr = @"<Root>
        <TEST xmlns:dt=""urn:schemas-microsoft-com:datatypes"">
            <A dt:dt=""string"">10</A>
            <B dt:dt=""string"">20</B>
        </TEST>
    </Root>";
    var root = XElement.Parse(xmlStr);
    var mapping = new Dictionary<string, Type>
    {
        { "string", typeof(string) },
    };
    var table = AsDataTable(root, "TEST", mapping);