如何简化Web.config中NLog节点的自定义配置转换?
简化NLog节点的Web.config转换方案
问题核心是XML命名空间的匹配规则:你的Web.config里的<nlog>节点带有明确的命名空间(比如http://www.nlog-project.org/schemas/NLog.xsd),而Web.config转换依赖XPath定位节点时,会严格区分命名空间——转换文件里无命名空间的<nlog>和原配置里带命名空间的<nlog>会被视为完全不同的节点,所以直接写<nlog>找不到目标节点。
可行的简化写法
不需要在转换文件的<nlog>节点上重复写全所有命名空间属性,只需要在转换文件的根<configuration>节点上定义命名空间前缀,就能让XPath正确定位目标节点:
写法一:嵌套节点简化
<configuration xmlns:nlog="http://www.nlog-project.org/schemas/NLog.xsd"> <nlog> <targets> <!-- 匹配name为database的target,修改connectionString --> <target name="database" connectionString="你的新连接字符串" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> </targets> </nlog> </configuration>
写法二:直接XPath定位(更简洁)
如果不想嵌套多层节点,也可以直接通过带命名空间的XPath定位目标target:
<configuration xmlns:nlog="http://www.nlog-project.org/schemas/NLog.xsd"> <target name="database" connectionString="你的新连接字符串" xdt:Transform="SetAttributes" xdt:Locator="XPath(/configuration/nlog:nlog/nlog:targets/nlog:target[@name='database'])" /> </configuration>
关键原理
在转换文件的<configuration>上添加xmlns:nlog="...",相当于给原配置里的nlog命名空间绑定一个前缀,这样XPath就能识别到原配置中带命名空间的<nlog>、<targets>、<target>节点,而转换文件里的<nlog>节点不需要重复写命名空间属性,达到简化目的。
内容的提问来源于stack exchange,提问作者Nicolas BASLEY
相关产品推荐
相关产品推荐

