【问题标题】:How to create xml from a template-c#如何从模板-c#创建xml
【发布时间】:2017-12-13 08:06:56
【问题描述】:

我有一个这样的 xml 模板

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

形成这个xml模板文件,我想动态生成一个xml。我该怎么做。

输出 xml 应该是这样的

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

我怎样才能做到这一点。我需要在模板文件中进行哪些更改。如何使用 c# 从这个模板 xml 文件中读取和创建 xml。

【问题讨论】:

  • 需要进入 XML 的数据来自哪里?

标签: c# .net xml


【解决方案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

【讨论】:

  • 可以否决投票者请告诉我为什么这不是一个选项?
  • 正是我所寻找的,比使用XmlSerializer 获得的模板更优雅,并且必须浏览一个点缀着变量的大型文档。
【解决方案2】:

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

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

   ...
}

并将类序列化为 XML 文件。

有一个很好的例子here

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

【讨论】:

  • 我不打算使用 xmlserializer
  • 为什么不呢?这样您只需要维护代码,不需要“手工”编写每个 XML 节点
  • 比我给出的答案更好
  • 我有一个列表,其中包含三个对象。我想创建一个包含所有三个对象详细信息的 xml,那么它将如何?
  • XmlWriter that automatically close elements using IDisposable 使用 c# 和 .Net IDisposable 实现了很好的实现。如果您喜欢 XmlWriter,这是避免所有 WriteEnd... 方法的好方法。
【解决方案3】:
【解决方案4】:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多