这里我的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,数据等
答案 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);
}