2012-04-04 32 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;