在xml中查找标头值

时间:2013-12-19 17:31:40

标签: c# xml linq datatable linq-to-xml

这里我的xml设置如下: 这是通过网络服务来的。

<doc>
<str name="data_id">XXXXXXX</str>
<str name="data">YYYY</str>
<str name="data2">zzzz</str>
...
..
<doc>

<doc>
<str name="data_id">X1X1X1X1X1X1X1</str>
<str name="data">Y1Y1Y1Y1</str>
<str name="data2">z1z1z1z1</str>
...
..
<doc>

我正在将整个xml转换为数据表。

如何将列标题作为列属性。 生成的数据表必须采用

格式
data_id   data
xxxxx     yyyy

加载xmldocument后,我有以下代码,我已编写将整个事物转换为csv字符串。

Stream k = r.GetResponse().GetResponseStream();
string csvOut = string.Empty;
var doc = XDocument.Load(k);
StringBuilder sb = new StringBuilder(100000);
DataTable table1 = new DataTable();

foreach (XElement node in doc.Descendants("doc"))
{
    foreach (XElement innerNode in node.Elements())
    {

        sb.AppendFormat("{0},", innerNode.Value);
    }
    sb.Remove(sb.Length - 1, 1);
    sb.AppendLine();
}
csvOut = sb.ToString();

我正在尝试将标题作为data_id,数据等

2 个答案:

答案 0 :(得分:3)

var xdoc = XDocument.Load(path_to_xml);
DataTable dt = new DataTable();

// Get all column names from document
var columnNames = xdoc.Root.Descendants("str")
                      .Select(s => (string)s.Attribute("name"))
                      .Distinct();

// create column for each unique str
foreach(var columnName in columnNames)
   dt.Columns.Add(new DataColumn(columnName));

foreach(var doc in xdoc.Root.Elements("doc"))
{
   var row = dt.NewRow();

   // fill row values
   foreach(var str in doc.Elements("str"))
       row[(string)str.Attribute("name")] = (string)str;

   dt.Rows.Add(row); // add row
}

如果所有文档都包含完全相同的str元素集,那么您可以替换使用

的列名称
var columName = xdoc.Root.Element("doc").Elements("str")
                    .Select(s => (string)s.Attribute("name"));

这将只读取第一个<doc>节点,而不是遍历xml文档中的所有元素。

答案 1 :(得分:0)

这里只是提示如何使用XDocument和LINQ来完成它。

    var query = from c in xmlFile.Descendants("doc") select c;
string data_id;
string data;
Datatable dt = new Datatable();
DataRow row;

foreach (XElement dom in query)
            {
            data_id = dom.Element("data_id").Value;
            data = dom.Element("data").Value;


  row = dt.NewRow();
  row[0] = data_id;
  row[1] = data;
  dt.Rows.Add(row);
            }