我有 ac# 项目,我在其中读取不同的 xml。我有不同的条件编译符号集,在此基础上我构建了两个不同的 .EXE。现在,我正在做的是根据条件读取不同的 xml。
#if ABC_build
//read xml1
#else
//read xml2
#endif
但在这种情况下,我必须在每个构建中都包含两个 xml。除了两个或三个标签外,这两个 xml 都是相同的。有没有办法编写单个 xml 并告诉编译器在某个构建中包含某些 xml 标签而不是另一个?
由于没有编译 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,因此它们不会显示在解决方案资源管理器中。
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
有多种方法可以编写“条件”XML 文件,该文件经过预处理以根据您提供的参数生成不同的 XML 文件。
一种是发明自己的“条件编译标签”并编写一个小的 XSLT 样式表来解释它们。例如,经常看到这样的事情:
<doc>
<para use-when="windows">....</para>
<para use-when="linux">....</para<
</doc>
并且很容易编写一个 XSLT 代码来复制文档,只保留那些相关的段落。
许多人使用的另一种方式是 XML 外部实体。我个人觉得这些有点不灵活。