本文目录
namespace是一个前缀,是一个约束,有时候还很讨厌,让你纠结许久,之前在PowerShell 基于Namespace来SelectNode 已经讨论过一点,今天再分享两个namespace陷阱。
这是一个原始的NLog配置文件模板:
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets></targets> <rules></rules> </nlog>
我添加的xml结点带有xmlns=””这样的命名空间,但是我不想要它。
陷阱
[xml]$nlogCfg=Get-Content ".\NLog.config" $extensions = $nlogCfg.CreateElement('extensions') $nlogCfg.nlog.AppendChild($extensions) $nlogCfg.Save('.\new.xml')
上面的脚本执行后,extension结点为:
<extensions xmlns="" />
原因
Nlog这个结点默认有命名空间xmlns,但是我没有指定,所以它给你指定一个空的。
解决方法
替换上面的第二行,使用System.Xml.XmlElement CreateElement(string qualifiedName, string namespaceURI) 方法。
$extensions = $nlogCfg.CreateElement('extensions',$nlogCfg.nlog.NamespaceURI)
我要添加的attribute没有命名空间,但是我想要它
陷阱
$extensions = $nlogCfg.CreateElement('extensions',$nlogCfg.nlog.NamespaceURI) $extensions.SetAttribute('xsi:blog','https://www.pstips.net')
生产的xml结点为:
<extensions blog="https://www.pstips.net" />
但是我期望的是:
<extensions xsi:blog="https://www.pstips.net" />
原因与解决方法
属性需要的命名空间应当使用string SetAttribute(string localName, string namespaceURI, string value)方法来指定。更改第二行为
$extensions.SetAttribute('blog',$nlogCfg.nlog.xsi,'https://www.pstips.net')
总结
命名空间该多的不能少,该少的不能多。
本文链接: https://www.pstips.net/namespace-pitfall-in-xml.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!