Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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_Datatable - Fatal编程技术网

C# 加载带有XML字符串的数据表

C# 加载带有XML字符串的数据表,c#,xml,datatable,C#,Xml,Datatable,我有XMLDocument,我使用XMLDocument提取了我想要的以下xml标记。选择SingleNode(“./tag”),将其加载到一个字符串中,并将其加载到一个数据表中 我尝试使用dataTable.ReadXML()但此函数的重载不允许使用字符串参数 有更好的方法吗 编辑:添加代码 XmlDocument xdoc = new XmlDocument(); xdoc.LoadXml(string_With_Xml); DataTable accessTable = new DataT

我有
XMLDocument
,我使用
XMLDocument提取了我想要的以下xml标记。选择SingleNode(“./tag”)
,将其加载到一个字符串中,并将其加载到一个数据表中

我尝试使用
dataTable.ReadXML()
但此函数的重载不允许使用字符串参数

有更好的方法吗

编辑:添加代码

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(string_With_Xml);
DataTable accessTable = new DataTable();
accessTable.ReadXml();

我希望这能为问题增加更多的内容。

您可以尝试以下方法:

//Your xml
string TestSTring = @"<Contacts> 
                    <Node>
                        <ID>123</ID>
                        <Name>ABC</Name>
                    </Node>
                    <Node>
                        <ID>124</ID>
                        <Name>DEF</Name>
                    </Node>
            </Contacts>";
StringReader StringStream = new StringReader(TestSTring);
DataSet ds = new DataSet();
ds.ReadXml(StringStream);
DataTable dt = ds.Tables[0];
//您的xml
字符串TestSTring=@”
123
基础知识
124
DEF
";
StringReader StringStream=新的StringReader(TestSTring);
数据集ds=新数据集();
ReadXml(StringStream);
DataTable dt=ds.表[0];

您可以尝试以下方法:

//Your xml
string TestSTring = @"<Contacts> 
                    <Node>
                        <ID>123</ID>
                        <Name>ABC</Name>
                    </Node>
                    <Node>
                        <ID>124</ID>
                        <Name>DEF</Name>
                    </Node>
            </Contacts>";
StringReader StringStream = new StringReader(TestSTring);
DataSet ds = new DataSet();
ds.ReadXml(StringStream);
DataTable dt = ds.Tables[0];
//您的xml
字符串TestSTring=@”
123
基础知识
124
DEF
";
StringReader StringStream=新的StringReader(TestSTring);
数据集ds=新数据集();
ReadXml(StringStream);
DataTable dt=ds.表[0];

您可以这样编写扩展名:

public static someType ReadXml(this DataTable dt, string yourParam1, string yourParam2)
{
   method body....
}

您可以这样编写扩展名:

public static someType ReadXml(this DataTable dt, string yourParam1, string yourParam2)
{
   method body....
}

您可以使用以下方法,例如,可以为字符串加载此处的字节数组:

Encoding.UTF8.GetBytes(somestring)
要加载datatable,请注意回退到DataSet的方法ReadXml,而不是datatable ReadXml。如果xml包含多个数据表,这并不总是合适的,因为此方法总是返回catch中的第一个数据表:

   public DataTable Convert(byte[] bytes)
    {
        var text = bytes.ToStringUtf8();
        if (string.IsNullOrWhiteSpace(text))
        {
            return null;
        }
        using (var stream = new MemoryStream(bytes))
        {
            try
            {
                var dt = new DataTable();
                dt.ReadXml(stream);
                return dt;
            }
            catch (InvalidOperationException ie)
            {
                Trace.WriteLine(ie);
                var ds = new DataSet();
                stream.Position = 0;
                ds.ReadXml(stream);
                if (ds.Tables.Count > 0)
                {
                    return ds.Tables[0];
                }
                return null;
            }
        }
    }

您可以使用以下方法,例如,可以为字符串加载此处的字节数组:

Encoding.UTF8.GetBytes(somestring)
要加载datatable,请注意回退到DataSet的方法ReadXml,而不是datatable ReadXml。如果xml包含多个数据表,这并不总是合适的,因为此方法总是返回catch中的第一个数据表:

   public DataTable Convert(byte[] bytes)
    {
        var text = bytes.ToStringUtf8();
        if (string.IsNullOrWhiteSpace(text))
        {
            return null;
        }
        using (var stream = new MemoryStream(bytes))
        {
            try
            {
                var dt = new DataTable();
                dt.ReadXml(stream);
                return dt;
            }
            catch (InvalidOperationException ie)
            {
                Trace.WriteLine(ie);
                var ds = new DataSet();
                stream.Position = 0;
                ds.ReadXml(stream);
                if (ds.Tables.Count > 0)
                {
                    return ds.Tables[0];
                }
                return null;
            }
        }
    }

请展示您想要的XML本身和数据表结构,顺便说一句,LINQ to XML比老式的XMLDocument更容易做到这一点。请展示您想要的XML本身和数据表结构,顺便说一句,LINQ to XML比老式的XMLDocument更容易实现这一点。我唯一的问题是,如果XML中没有数据值,我仍然希望DataTable具有XML中的列名,即使没有可用的行,有没有办法做到这一点?@SpaceApple,如果删除数据,例如,
ABC
123
等,您仍然会得到一个有列但没有行的数据表。当我尝试将xml直接读入数据表而不是数据集时,我得到一个XmlException,说“根元素丢失”。@SpaceApple,这就是为什么您应该使用DataSetNow,如果xml没有作为空标记返回的行数据,我不希望它返回,我希望它返回列,即使没有datarow。这就是为什么它在加载数据表而不是数据集时会中断。我不知道如何克服这个问题我唯一的问题是,如果XML中没有数据值,我仍然希望DataTable具有XML中的列名,即使没有可用的行,有什么方法吗?@SpaceApple,如果删除数据,例如
ABC
123
,等等,您仍然会得到一个有列但没有行的datatable。当我尝试将xml直接读入datatable而不是DataSet时,我得到一个XmlException,它说“根元素丢失”。@SpaceApple,这就是为什么如果没有行数据,xml返回为空标记,您应该使用DataSetNow的原因,我不希望,我希望它返回列,即使没有datarow。这就是为什么它在加载数据表而不是数据集时会中断。我不知道如何克服这个问题