Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. <root>
  2. <header name ='a'>
  3. <item name='11' />
  4. <item name='22' />
  5. </header>
  6. <header name ='b'>
  7. <item name='33' />
  8. <item name='44' />
  9. <item name='55' />
  10. </header>
  11.  
  12. </root>
  13.  
  14. // create the XmlDocument and add <root> node
  15. XmlDocument doc = new XmlDocument();
  16. doc.AppendChild(doc.CreateElement("root"));
  17.  
  18. // dictionary to keep track of <header> nodes
  19. Dictionary<string, XmlNode> nodesPerColumnA = new Dictionary<string, XmlNode>();
  20.  
  21. // Loop through data rows
  22. foreach (DataRow row in tbl.Rows)
  23. {
  24. // extract values for ColumnA and ColumnB as strings
  25. string columnAValue = row["ColumnA"].ToString();
  26. string columnBValue = row["ColumnB"].ToString();
  27.  
  28. // create a new <item> XmlNode and fill its attribute @Name
  29. XmlElement newNode = doc.CreateElement("item");
  30.  
  31. XmlAttribute newNodeAttribute = doc.CreateAttribute("name");
  32. newNodeAttribute.InnerText = columnBValue;
  33.  
  34. newNode.Attributes.Append(newNodeAttribute);
  35.  
  36. // check if we already have a <header> node for that "ColumnA" value
  37. if(nodesPerColumnA.ContainsKey(columnAValue))
  38. {
  39. // if so - just add <item> below that <header>
  40. XmlNode parent = nodesPerColumnA[columnAValue];
  41.  
  42. parent.AppendChild(newNode);
  43. }
  44. else
  45. {
  46. // if not - create appropriate <header> node and its @name attribute
  47. XmlElement header = doc.CreateElement("header");
  48.  
  49. XmlAttribute headerAttr = doc.CreateAttribute("name");
  50. headerAttr.InnerText = columnAValue;
  51.  
  52. header.Attributes.Append(headerAttr);
  53.  
  54. header.AppendChild(newNode);
  55.  
  56. doc.DocumentElement.AppendChild(header);
  57.  
  58. // store that <header> xmlnode into the dictionary for future use
  59. nodesPerColumnA.Add(columnAValue, header);
  60. }
  61. }
  62.  
  63. // check the contents of the XmlDocument at the end
  64. string xmlContents = doc.InnerXml;
  65.  
  66. SELECT
  67. ColumnA AS '@name',
  68. (SELECT ColumnB AS '@name'
  69. FROM YourTable t
  70. WHERE t.ColumnA = YourTable.ColumnA
  71. FOR XML PATH('item'), TYPE)
  72. FROM
  73. YourTable
  74. GROUP BY
  75. ColumnA
  76. FOR XML PATH('header'), ROOT('root')
  77.  
  78. <root>
  79. <header name="a">
  80. <item name="11" />
  81. <item name="22" />
  82. </header>
  83. <header name="b">
  84. <item name="33" />
  85. <item name="44" />
  86. <item name="55" />
  87. </header>
  88. </root>
  89.  
  90. var qry = from row in Table
  91. group row by row.ColumnA into header
  92. select header;
  93.  
  94. var elem = new XElement("root");
  95.  
  96. foreach (var header in qry)
  97. {
  98. var elemHead = new XElement("header", new XAttribute("name", header.Key));
  99. elem.Add(elemHead);
  100. foreach (var item in header)
  101. elemHead.Add(new XElement("item", new XAttribute("name", item.ColumnB)));
  102. }
  103. // the variable elem contains the result.
  104.  
  105. XDocument yourDocument = new XDocument(new XElement("root",
  106. new XElement("header",
  107. new XAttribute("name", "a"),
  108. new XElement("item",
  109. new XAttribute("name", "11")),
  110. new XElement("item",
  111. new XAttribute("name", "22"))),
  112. new XElement("header",
  113. new XAttribute("name", "b"),
  114. new XElement("item",
  115. new XAttribute("name", "33")),
  116. new XElement("item",
  117. new XAttribute("name", "44")),
  118. new XElement("item",
  119. new XAttribute("name", "55")))));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement