有没有办法在xml中使用条件编译符号

时间:2013-11-05 09:47:12

标签: c# xml

我有一个c#项目,我正在阅读不同的xmls。我有不同的条件编译符号集,基于此我构建两个不同的.EXE。现在,我正在做的是根据条件阅读不同的xmls。

#if ABC_build
//read xml1
#else
//read xml2
#endif

但在这种情况下,我必须在每个构建中包含两个xmls。除了两个或三个标签之外,两个xmls都是相同的。有没有办法编写单个xml并告诉编译器在某个构建中包含某些xml标记而不包含其他xml标记?

3 个答案:

答案 0 :(得分:5)

由于没有编译XML文件,所以没有像条件编译那样的东西。因此,我确定您必须在构建输出中包含两个XML文件作为您尝试解决的主要问题。
你可以做的是根据配置调整你的构建,例如,对于Debug构建,文件A被复制到输出文件夹和Release构建文件B. 为了实现这一点,您需要在csproj文件中添加类似的代码:

  <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
    <XmlInput Include="FileA.xml">
      <Visible>False</Visible>
    </XmlInput>
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)' == 'Release' ">
    <XmlInput Include="FileB.xml">
      <Visible>False</Visible>
    </XmlInput>
  </ItemGroup>
  <ItemGroup>
    <XmlOutput Include="$(OutputPath)\File.xml">
      <Visible>False</Visible>
    </XmlOutput>
  </ItemGroup>
  <Target Name="AfterBuild">
    <Copy SourceFiles="@(XmlInput)" DestinationFiles="@(XmlOutput)" />
  </Target>
  <Target Name="BeforeClean">
    <Delete Files="@(XmlOutput)" />
  </Target>

此代码将一个ItemGroup添加到依赖于所选配置的构建中。在AfterBuild目标中,文件将复制到输出路径。在BeforeClean目标中,将再次删除该文件。在您的代码中,您不再需要条件编译,但在输出文件夹中有一个可以访问的公共文件名。
在示例中,我向项目添加了两个XML文件(FileA.xml和FileB.xml)。我再次将它们作为XmlOutput项引用,以便选择要复制的正确文件。由于它们标有Visible = false,因此它们不会显示在解决方案资源管理器中。

答案 1 :(得分:0)

我相信你不能告诉编译器不要读取一些xml标签。这不是编译时逻辑,而是运行时逻辑。

但是,您可以在#if

中使用布尔逻辑
#if (ABC_build || XYZ_build)
//read xml
#endif

答案 2 :(得分:0)

您可以通过多种方式编写“条件”XML文件,该文件经过预处理,可根据您提供的参数生成不同的XML文件。

一个是发明你自己的“条件编译标签”并编写一些XSLT样式表来解释它们。例如,看到这样的事情很常见:

<doc>
  <para use-when="windows">....</para>
  <para use-when="linux">....</para<
</doc>

并且很容易编写一个复制文档的XSLT代码,只保留那些相关的段落。

许多人使用的另一种方式是XML外部实体。我个人认为这些有点不灵活。