【问题标题】:How to read XML into a DataTable?如何将 XML 读入 DataTable?
【发布时间】:2010-12-16 13:16:20
【问题描述】:

我在内存中的 string 中有一些 XML,就像这样:

<symbols>
  <symbol>EURCHF</symbol>
  <symbol>EURGBP</symbol>
  <symbol>EURJPY</symbol>
  <symbol>EURUSD</symbol>
</symbols>

我想将其读入DataTable。我是这样做的:

DataTable dt = new DataTable();
dt.TableName = "symbols";
dt.Columns.Add("symbol");

if (!String.IsNullOrEmpty(symbols))
{
    dt.ReadXml(new StringReader(symbols));
}

但是,当我检查行数时,DataTable 最终的行数为零。我做错了什么?

【问题讨论】:

标签: c# xml datatable


【解决方案1】:

从这里:http://www.dreamincode.net/code/snippet3186.htm

// <summary>
/// method for reading an XML file into a DataTable
/// </summary>
/// <param name="file">name (and path) of the XML file</param>
/// <returns></returns>
public DataTable ReadXML(string file)
{
    //create the DataTable that will hold the data
    DataTable table = new DataTable("XmlData");
    try
    {
        //open the file using a Stream
        using(Stream stream = new  FileStream(file, FileMode.Open, FileAccess.Read))
        {
            //create the table with the appropriate column names
            table.Columns.Add("Name", typeof(string));
            table.Columns.Add("Power", typeof(int));
            table.Columns.Add("Location", typeof(string));

            //use ReadXml to read the XML stream
            table.ReadXml(stream);

            //return the results
            return table;
        }                
    }
    catch (Exception ex)
    {
        return table;
    }
}

您可能想看看DataTable.ReadXml 方法。

编辑:如果内存中有 xml 对象,则可以直接使用 ReadXml 方法。 DataTable.ReadXml(MemoryStream Object);

编辑 2:我做了导出。需要以下 XML 架构:

<?xml version="1.0" standalone="yes"?>
<DocumentElement>
  <symbols>
    <symbol>EURCHF</symbol>
  </symbols>
  <symbols>
    <symbol>EURGBP</symbol>
  </symbols>
  <symbols>
    <symbol>EURJPY</symbol>
  </symbols>
</DocumentElement>

【讨论】:

  • 这就是我正在做的。我的问题是为什么我的表有零行?我的代码有什么问题?
  • 很可能是架构问题。尝试创建类似的数据表并调用 WriteXML。然后检查写入的内容并与您的 xml 进行比较。这应该可以消除数据表为什么为空的疑问。
  • 谢谢 - 这帮助我解决了这个问题。我以不同的方式编写它,我现在使用DataTable.WriteXml,效果很好。
【解决方案2】:

像这样:

Dim strXmlString As String = "<tables><row><table_name>Table1</table_name><record_key>1</record_key></row>"
strXmlString += "<row><table_name>Table2</table_name><record_key>2</record_key></row></tables>"
Dim srXMLtext As System.IO.StringReader = New System.IO.StringReader(strXmlString)

Dim dt As New DataTable
dt.ReadXml(srXMLtext)

【讨论】:

  • 注意:您仍然需要将架构显式添加到 DataTable(上面的示例中没有。)
【解决方案3】:

我也一直在寻找一种简单的方法来做同样的事情,但从未真正找到我真正想要的东西。这是我遇到的一个解决方案。它可以工作,但我不太喜欢它,因为我首先必须将文件写入DataSet,然后将创建的DataSet-Table 放入DataTable

不管怎样,代码如下:

DataSet ds = new DataSet();
ds.ReadXml(path);
DataTable newDataTable = ds.Tables[0];

我还在我的DataTable 上尝试了.ReadXml,但总是抛出异常。

我对这个解决方案不满意,但它至少有效。

【讨论】:

    【解决方案4】:

    另一种方式:

    public DataTable ReadXML(string yourPath)
            {
                DataTable table = new DataTable("Item");
                try
                {
                    DataSet lstNode = new DataSet();
                    lstNode.ReadXml(yourPath);
                    table = lstNode.Tables["Item"];
                    return table;
                }
                catch (Exception ex)
                {
                    return table;
                }
            }

    这里是 XML 格式:

    <?xml version="1.0" encoding="utf-8" ?>
    <db>
      <Item>
        <Id>222</Id>
        <OldCode>ZA</OldCode>
        <NewCode>ZAF</NewCode>
        <Name>Africa (South )</Name>
      </Item>
    </db>

    【讨论】:

      【解决方案5】:

      使用数据集代替数据表

      【讨论】:

      • 事实上,dataSET 解决了我在 Powershell 中的问题。请参阅下面的示例。
      【解决方案6】:

      这是 Powershell 中的示例代码:

      $xmlString = @"
      <table1>
          <row1>
              <c1>value1</c1><c2>value2</c2>
          </row1>
          <row2>
              <c1>value3</c1><c2>value4</c2>
          </row2>
      </table1>
      "@
      $sr =[System.IO.StringReader]($xmlString)
      
      $dataset =[System.Data.DataSet]::new()
      $null = $dataset.ReadXml($sr)
      

      这是 $dataset.tables 的结果:

      c1     c2    
      --     --    
      value1 value2
      value3 value4
      

      【讨论】:

        【解决方案7】:

        动态 Xml 到数据表

        public DataTable XMLToDataTable(string YourFilePath)
        {
                DataTable table = new DataTable("XMLTABLE");
                try
                {
                    #region &quot;&apos;< &lt;> &gt;&amp NOT VALID EXTENSTION IN XML
                    var xmlContent = File.ReadAllText(YourFilePath);
                    XmlDocument xDoc = new XmlDocument();
                    xDoc.LoadXml(xmlContent.Replace("'", "&apos;").Replace("&", "&amp;"));
                    xDoc.Save(YourFilePath);
                    #endregion
                    //All XML Document Content
                    //XmlElement root = xDoc.DocumentElement;
                    string RootNode = xDoc.DocumentElement.Name;
                    string RootChildNode = xDoc.DocumentElement.LastChild.Name;
                    DataSet lstNode = new DataSet();
                    lstNode.ReadXml(YourFilePath);
                    table = lstNode.Tables[RootChildNode];
                    return table;
                }
                catch (Exception ex)
                {
                    
                }
        }
        

        【讨论】:

        • 这可能是一个正确的答案,但对您的代码提供额外的解释会很有用,以便开发人员能够理解您的推理。这在用几个现有答案回答旧问题时尤其重要,因为应该清楚为什么您的答案与现有提案不同。您介意用更多详细信息更新您的评论吗?
        猜你喜欢
        • 2016-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 2013-06-11
        • 2011-08-29
        相关资源
        最近更新 更多