为什么这个web.config转换说找不到applicationSettings元素?

27

在TeamCity中转换web.config文件时,我遇到了以下错误。 它发生在元素<applicationSettings xdt:Transform="Replace">上。

源文档中没有任何元素与“/configuration/applicationSettings”匹配

源文件具有此设置。 有什么解决方法吗?

2个回答

32

我不得不从configuration节点中删除命名空间属性。在我的使用的元素和声明的模式之间存在冲突。

xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"

4
我正在寻找解决这个问题的方法,在网络上只有这个回答对我有效,谢谢! - saman0suke
我在自定义配置部分遇到了相反的问题。在自定义根元素上,我必须包含与自定义配置模式匹配的命名空间属性,否则会出现“没有匹配的元素”错误。因此,如果我指定任何转换,<customConfig>将不匹配;我必须使用<customConfig xmlns="customSchemaUrl">。只有这样,在我的自定义配置部分内部才能进行转换。 - Suncat2000

19

我希望为其他人提供更详细的答案。

在Visual Studio 2010中,web.config变换引擎不遵守xmlns声明。因此,如果您的源web.config有一个xmlns声明,并且如果您创建了一个变换,则变换将无法正常工作。这是因为当我们执行XPath以识别应该替换的源时,我们无法找到该值。为了解决这个问题,您应该删除源web.config和变换中的xmlns声明。

话虽如此,在Visual Studio 2010 SP1中,我们修复了命名空间错误。因此,您的源web.config以及您的变换必须同意xmlns,如果其中一个有它,另一个也必须有它。

我怀疑您正在使用预-SP1版本,但不确定。为了确保行为不会在升级到SP1时改变,建议您从源web.config和变换中删除xmlns声明。web.config文件中不需要xmlns,所以可以安全地删除它。


我理解的是,在转换文件中使用命名空间,并匹配转换后文件中相应的xmlns,可以绕过这个bug。从xml中删除命名空间并不好,因为这将使得xml处理器处理的内容完全不同... - Alexey Shcherbak
您不需要命名ns元素,您可以使用默认的xmlns使其工作,但它们必须同时存在于源和转换中。话虽如此, 对于web.config,是否有xmlns没有区别。建议不要有它(也解释了为什么在VS中创建新项目时web.config上没有xmlns)。 - Sayed Ibrahim Hashimi
只要您的命名空间声明在文档/转换时匹配,它们就应该可以正常工作。 - Sayed Ibrahim Hashimi
只要文件/转换器的命名空间声明匹配,它们应该能够工作。 它不起作用 - 这太荒谬了。我的基本配置和转换器配置中都有相同的 xmlns= 值 - 它无法在基本配置中找到匹配的节点,因此无法进行转换。XmlTransformation 类似乎不支持命名空间。这使得我们使用 Quartz.Net 看不起。因为 Quartz 要求在文件中设置 xmlns= 值。在今天这个时代,如何可能不支持 xml 命名空间? - znelson
我正在使用Visual Studio 2017,但在“/configuration/system.webServer/rewrite”方面仍然存在完全相同的问题。 - Jonathan Wood
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接