1

我有 ac# 项目,我在其中读取不同的 xml。我有不同的条件编译符号集,在此基础上我构建了两个不同的 .EXE。现在,我正在做的是根据条件读取不同的 xml。

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

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

4

3 回答 3

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,因此它们不会显示在解决方案资源管理器中。

于 2013-11-05T10:07:51.137 回答
0

I believe you can't tell the compiler to not read some xml tags. That is not a compile-time logic but rather a runtime-logic.

However, you can have boolean logic in the #if

#if (ABC_build || XYZ_build)
//read xml
#endif
于 2013-11-05T09:59:46.517 回答
0

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

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

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

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

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

于 2013-11-05T12:15:57.493 回答