【问题标题】:T4 Template containing XML results in parse errors包含 XML 的 T4 模板导致解析错误
【发布时间】:2013-08-19 20:29:37
【问题描述】:

我已经为我的 web 和 windows 项目的配置文件创建了 T4 模板。我可以成功生成主 web.config,以及其他环境的所有配置,即 web.ci.config 等。但是,我无法摆脱我的主 tt 文件上的错误,例如:

  • 字符“#”,十六进制值 0x23 在 XML 名称中是非法的。
  • 字符“
  • 意外的 XML 声明。 XML 声明必须是文档中的第一个节点,并且它之前不允许出现空白字符。

我应该缺少 xml 架构或引用,但是什么?


我的文件看起来像:

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension= ".config" #>  
<?xml version="1.0" encoding="utf-8"?>
<configuration>
...  
    <add key="FileUploadFolder" value="<#= this.FileUpload #>" /> 
...
</configuration>
<#+ 
   string FileUpload="\\\\server\\folder";
#>

这里是screenshot

【问题讨论】:

  • 我认为问题可能是 .tt 文件被解析为 XML,并且被您的 XML 内容弄糊涂了。出于兴趣 - 如果将 output extension 设置为 .xml 会发生什么?
  • 是的,可能但是我在网上看到的所有示例截图都没有错误[红色下划线]。当我设置为 .xml 时,它会创建与 .config 输出完全相同的 [和预期的] 文档。
  • 似乎是 Visual Studio 2012 T4 templates generating XML gives error 的副本,它有一个可接受的答案。

标签: .net xml config t4 transformation


【解决方案1】:

同样的问题。我通过在 .tt 文件中替换该行来解决它

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

<# WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); #>

一旦 VS 对模板文件的 XML 格式感到困惑,它似乎会持续存在这种困惑——即使在像上面那样编辑并重新启动之后也是如此。解决这个问题的唯一方法似乎是从您的项目中删除现有的 .tt 文件并从头开始重新创建它。

通过此更改,.tt 文件不再具有 &lt;?xml?&gt; 标记,因此 VS 不会将其视为 XML 文件。它忽略文字字符串中的所有内容。您的整个模板现在看起来像这样:

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension= ".config" #>  
<# WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); #>
<configuration>
...  
    <add key="FileUploadFolder" value="<#= this.FileUpload #>" /> 
...
</configuration>
<#+ 
    string FileUpload="\\\\server\\folder";
#>

【讨论】:

  • 不,它不起作用。我的问题不在于输出,配置文件已完美生成。问题是当我在 VS IDE 中打开 tt 文件时,它从第一行开始在字符下划线
  • 我添加了screenshot
  • 您添加的屏幕截图没有显示我建议的更改。第三行应替换为&lt;# Writeline... #&gt;,如上所示。不要忘记从头开始尝试,使用新的.tt 文件,否则 VS 仍然会感到困惑。
  • 我现在了解您的困惑,您不应该在输出中进行此更改,而应在模板本身中进行。我将编辑答案以避免混淆。
  • @DotNetWise 你签出this question了吗?这是关于VS2012的,答案被接受了。
【解决方案2】:

这里发生的情况是 VS 中的 Xml 语言服务错误地将您的 T4 文件识别为 Xml 文件,因此喷出大量误报错误消息。

我正在研究是否有强制它忽略 T4 文件的解决方法。 如果您可以在 Microsoft Connect 上记录错误,那将很有帮助。

【讨论】:

  • 查看我的答案,了解我使用的解决方法 - 可以为您节省一些时间。
  • 是的,Reinier 的解决方法似乎是目前最好的解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多