Reputation: 31
I've planned a new Application. My Idea is, to generate XML docs. I need a way to convert this XML docs to a HTML Table.
My XML structure is:
<Checklist>
<Title>Titletext</Title>
<Group>
<Title>Active Directory</Title>
<Content>
<Line>
<text type="array">
<value>Connect to:</value>
<value>dsa.msc start</value>
</text>
</Line>
<Line>
<text type="array">
<value>Gruppen anpassen anhand des Arbeitsortes</value>
<value>Profilpfad eintragen</value>
</text>
</Line>
</Content>
</Group>
</Checklist>
I'll try to convert this xml to HTML Tables like this:
<html>
<table>
<tr class="head">
<td>#Group -> Title</td>
</tr>
<tr class="text">
<td><p>#Line -> Value 1</p><p>@Line -> Value2</p></td>
</tr>
</table>
</html>
My first idea was, to read the XML line by line, and add this values to a ListArray. With a foreach i'll try to generate the HTML
foreach(string item in ViewBag.Content)
Is there a much "better" option or should i try to solve this this way =) Maybe someone can give me a best practice hint or something =)
Thanks!
Upvotes: 0
Views: 3779
Reputation: 2201
Your best bet would be to use Extensible Stylesheet Language (XSL). You can use XSL Tansformations (XSLT) to create templates in xml which sets out rules on how to convert XML into another format. In your case the template would be something like:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th><xsl:value-of select="Checklist/Title/Group/Title" /></th>
</tr>
<xsl:for-each select="Checklist/Group/Content/Line">
<tr>
<td>
<xsl:for-each select="Value">
<p><xsl:value-of select="value" /></p>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
Here's a good example on W3Schools and this SO answer shows you how to implement it in C#.
Upvotes: 1
Reputation: 14306
Firstly, I'd create a class that represents a row of your table - a model.
Than I would use LINQ to XML to convert the xml file to a list of objects of your model class.
Than, instead of putting it to the ViewBag, I'd put the list of model objects as a View's model (it can be strongly typed). In the controller you return the view this way:
List<MyModel> items = ....
return View(items)
And finally I'd iterate through it in Razor like that:
@foreach(var item in Model){ // the Model here is whatever you passed to the View method call in your controller
// create table rows or whatever you need
}
Upvotes: 0
Reputation: 6216
There's a standard way of doing this:
See this example for MVC integration
Upvotes: 0