Finding header value in xml

a 夏天 提交于 2019-12-11 14:22:54

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!