I have a xml template like this
<User>
<UserId></UserId>
<UserName></UserName>
<Roles>
<Role></Role>
<Roles></Role>
</Roles>
</User>
Form this xml template file,dynamicaly i want to generate an xml.How can i do this.
Output xml should look like this
<User>
<UserId>user1</UserId>
<UserName>fr</UserName>
<Roles>
<Role>abc</Role>
<Role>def</Role>
</Roles>
</User>
How can i achieve this.What all changes i need to make in template file.How to read and create xml from this tempalte xml file using c#.
You can use XmlSerializer
and create a simple class with properties according to the template:
public class User
{
public UserId{get;set;}
...
}
And serialize the class to XML file.
There's a good example here.
Option #2:
If for some reason you do not want to use XmlSerializer
use XmlWriter
- in order to prevent forgetting to close elements I suggest you use "AutoClose" XmlWriter - I've blogged about how to create this simple class on my blog - XmlWriter that automatically close elements using IDisposable
Serializing is an option, but if you really need a template, you can use this https://github.com/beto-rodriguez/Templator
here is an example
C#
UserClass user = new UserClass();
user.UserId = 1;
user.UserName = "my name";
User.Roles = new List<string>(){"admin", "sales"};
//some other properties...
var compiler = new Compiler()
.AddElementToScope("user", user);
var compiled = compiler.CompileXml(@"C:\...\myXml.xml")
XLM Source
<User>
<UserId>{{user.UserId}}</UserId>
<UserName>{{user.UserName}}</UserName>
<Roles Tor.Repeat="role in user.Roles">
<Role>{{role}}</Role>
<Roles></Role>
</Roles>
</User>
Compiled
<User>
<UserId>1</UserId>
<UserName>my name</UserName>
<Roles>
<Role>admin</Role>
<Role>sales</Role>
<Roles></Role>
</Roles>
</User>
you can install it from Nuget too:
Install-Package SuperXML
var templateXML = "C://template.xml"//full path for the template xml
XmlDocument doc = new XmlDocument();
FileStream fs = new FileStream(templateXML, FileMode.Open, FileAccess.Read);
doc.Load(fs);
XmlNode node = doc.DocumentElement;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("pf", "http://www.example.com/abc");
node = doc.DocumentElement;
nodeName = "/pf:Message/pf:User/pf:UserID";
node.SelectSingleNode(nodeName, nsmgr).InnerXml = "user1";put you custom value
nodeName = "/pf:Message/pf:User/pf:UserName";
node.SelectSingleNode(nodeName, nsmgr).InnerXml = "fr";put you custom value
....
.....
.......
var postData = node.ParentNode.InnerXml;
postData = node.OuterXml;