XML配置中的变量

时间:2013-06-05 12:56:24

标签: c# xml variables app-config system.configuration

我正在尝试在我的项目中使用xml配置文件。现在看起来像:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <section name="replication" type="Project.Replication.ReplicationConfigSection, Project.Replication" />
    <section name="processing" type="Project.Processing.ProcessingConfigSection, Project.Processing" />
  </configSections>

  <replication>
    <streams>
      <stream name="STREAM_DATA_14360" />
    </streams>
  </replication>

  <processing dataStream="STREAM_DATA_14360" />

</configuration>

它运作正常,但我对其中的重复项感到困惑("STREAM_DATA_14360")。

您能否提醒我,如何在XML中创建变量或者在应用程序配置中重用数据?

更新

在现实生活中,我的配置有更多部分。有一个值,在这部分的许多部分中都有:STREAM_DATA_14360。所以我希望能够仅在配置文件的一个位置更改此值,并在其他位置使用对它的引用。

改变配置的速度 - 是它的第一个原因。

文件的大小是秒,因为值可能很大:STREAM_INFO_FUTURE_SESSION_CONTENTS_12421(即第三方名称)

4 个答案:

答案 0 :(得分:1)

XML没有任何本机扩展宏或模板 - 任何场景都需要您执行预处理步骤或者使用代码替换值来读取配置。

如果这些不是编辑名称,似乎一个简单的搜索/替换可以解决问题,而不会对误报有太多担忧。

您可以将T4 templatesweb.config transformation放在一起作为预处理器,这是否值得,实际上取决于您希望修改此文件的频率。

还应该可以将XDT engine引擎转换为替换,但您可能必须为{{3}}编写一些托管代码,具体取决于您的配置文件的设置方式。

答案 1 :(得分:1)

您只需在<appSettings>中添加此值,然后按照您的说法访问它。

您可以按照以下方式执行此操作:

<appSettings>
  <add key="StreamName" value="STREAM_DATA_14360"/>
</appSettings>

在代码中,您可以按如下方式访问它:

 string streamName = ConfigurationManager.AppSettings["StreamName"];

确保在使用之前添加对System.Configuration程序集的引用。

答案 2 :(得分:0)

除了使用可能(或可能不会)促进生活的外部代码之外,您还可以定义自己继承自ConfigurationSection的类,其中您定义并封装键/值对并使用{{1属性。

有关如何:使用ConfigurationSection 创建自定义配置文件的详细信息,请查看http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

编辑:您可以在xsd中进行引用(检查here

答案 3 :(得分:0)

感谢您的回答。我同意Mark的观点,XML中没有变量或引用的支持。但是,就我而言,有更简单的解决方案。我现在感到愚蠢,但希望它也会帮助另一个慢点。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <section name="global" type="Project.GlobalConfigSection, Project" />
    <section name="replication" type="Project.Replication.ReplicationConfigSection, Project.Replication" />
    <section name="processing" type="Project.Processing.ProcessingConfigSection, Project.Processing" />
  </configSections>

  <global>
    <streamNames>
      <streamName name="STREAM_DATA_14360" id="1"/>
    </streamNames>
  </global>

  <replication>
    <streams>
      <stream nameId="1" />
    </streams>
  </replication>

  <processing dataStreamId="1" />

</configuration>

结果:需要编辑代码以使用全局部分作为所有长名称的来源

优势:快速重命名,值可重用