我有一个c#项目,我正在阅读不同的xmls。我有不同的条件编译符号集,基于此我构建两个不同的.EXE。现在,我正在做的是根据条件阅读不同的xmls。
#if ABC_build
//read xml1
#else
//read xml2
#endif
但在这种情况下,我必须在每个构建中包含两个xmls。除了两个或三个标签之外,两个xmls都是相同的。有没有办法编写单个xml并告诉编译器在某个构建中包含某些xml标记而不包含其他xml标记?
答案 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外部实体。我个人认为这些有点不灵活。