PowerShell处理xml时遇到的namespace陷阱


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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注