问题
Here my xml is setup as follows: This is coming via a webservice.
<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>
I am converting the whole xml into a datatable.
How do I get the column header as column attributes. The resulting datatable have to be in the format as
data_id data
xxxxx yyyy
After loading xmldocument I have the following code which I have written to convert the whole thing into a csv string.
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();
I am trying to get the headers as data_id , data etc
回答1:
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
}
If all docs contain exactly same set of str
elements, then you can replace column names getting with
var columName = xdoc.Root.Element("doc").Elements("str")
.Select(s => (string)s.Attribute("name"));
That will read only first <doc>
node instead of traversing all elements in xml document.
回答2:
Here is just a hint how you should do it with XDocument and 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);
}
来源:https://stackoverflow.com/questions/20688079/finding-header-value-in-xml