2012-04-04 36 views
2

创建XML我有一个XML模板这样如何从一个模板的C#

<User> 
<UserId></UserId> 
<UserName></UserName> 
<Roles> 
<Role></Role> 
<Roles></Role> 
</Roles> 
</User> 

表这个XML模板文件,dynamicaly我要生成一个xml.How我可以做到这一点。

输出XML应该是这样的

<User> 
<UserId>user1</UserId> 
<UserName>fr</UserName> 
<Roles> 
<Role>abc</Role> 
<Role>def</Role> 
</Roles> 
</User> 

我如何能实现我需要的模板,使file.How阅读和使用C#从这个tempalte XML文件中创建XML this.What所有更改。

+0

数据来自哪里需要进入XML? – kaj 2012-04-04 07:14:53

回答

4

您可以使用XmlSerializer并创建一个简单的类根据模板属性:

public class User 
{ 
    public UserId{get;set;} 

    ... 
} 

和序列化的类XML文件。

有一个很好的例子here

选项#2
如果由于某种原因你不想使用XmlSerializer使用XmlWriter - 为了防止忘记关闭的元素,我建议你使用“自动关闭”的XmlWriter - 我的博客上讲述如何在我的博客创建这个简单的类 - XmlWriter that automatically close elements using IDisposable

+0

我不打算使用xmlserializer – user922834 2012-04-04 07:19:46

+1

为什么不呢?这样你只需要维护代码,不需要手工编写每一个XML节点 – 2012-04-04 07:21:10

+1

比我给出的更好的答案 – 2012-04-04 07:23:18

1

序列化是一种选择,但如果你真的需要一个模板,你可以使用这个https://github.com/beto-rodriguez/Templator

这里有一个例子

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来源

<User> 
    <UserId>{{user.UserId}}</UserId> 
    <UserName>{{user.UserName}}</UserName> 
    <Roles Tor.Repeat="role in user.Roles"> 
    <Role>{{role}}</Role> 
    <Roles></Role> 
    </Roles> 
</User> 

编译

<User> 
    <UserId>1</UserId> 
    <UserName>my name</UserName> 
    <Roles> 
    <Role>admin</Role> 
    <Role>sales</Role> 
    <Roles></Role> 
    </Roles> 
</User> 

你可以从安装的NuGet太:

Install-Package SuperXML 
+1

可以downvoter plase让我知道为什么这不是一个选项? – 2015-08-07 17:47:30

0

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;