如何在PowerShell中添加XML名称空间作为属性前缀?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PowerShell中添加XML名称空间作为属性前缀?相关的知识,希望对你有一定的参考价值。

我想使用Powershell v3生成以下XML

<?xml version="1.0" encoding="UTF-8"?>
<AMXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://registration.somewhere.com/schemas/something.xsd">
  <Type>Something</Type>
</AMXML>

到目前为止我已经得到了以下代码

[xml]$doc = New-Object System.Xml.XmlDocument
$dec = $doc.CreateXmlDeclaration("1.0", "UTF-8", $null)
$doc.AppendChild($dec) | Out-Null

$root = $doc.CreateNode("element","AMXML",$null)

$att = $doc.CreateAttribute("xmlns:xsi")
$att.Value = "http://www.w3.org/2001/XMLSchema-instance"
$root.Attributes.Append($att) | Out-Null

$att1 = $doc.CreateAttribute("xsi:noNamespaceSchemaLocation")
$att1.Value = "http://registration.somewhere.com/schemas/something.xsd"
$root.Attributes.Append($att1) | Out-Null

$x = $doc.CreateNode("element", "Type", $null)
$x.InnerText = "Something"
$root.AppendChild($x) | Out-Null

$doc.AppendChild($root) | Out-Null

$doc.InnerXml

哪个产生

<?xml version="1.0" encoding="UTF-8"?>
<AMXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" noNamespaceSchemaLocation="http://registration.somewhere.com/schemas/something.xsd">
  <Type>Something</Type>
</AMXML>

尽管创建属性xsi:noNamespaceSchemaLocation,输出将删除xsi:前缀,只留下noNamespaceSchemaLocation="http://registration.some where.com/schemas/something.xsd",这使我的xsd失败。

我尝试了CreateAttribute()的各种重载,导致额外的属性或交换的前缀。

我哪里错了?

答案

您需要在xsi名称空间中创建该属性:

$xsi_uri = 'http://www.w3.org/2001/XMLSchema-instance'

$att1 = $doc.CreateAttribute('xsi', 'noNamespaceSchemaLocation', $xsi_uri)
$att1.Value = "http://registration.somewhere.com/schemas/something.xsd"
$root.Attributes.Append($att1) | Out-Null

以上是关于如何在PowerShell中添加XML名称空间作为属性前缀?的主要内容,如果未能解决你的问题,请参考以下文章

在 Powershell 中,如何通过提供名称作为 $var 来设置环境变量?

如何使用 XSLT 将名称空间添加到我的 XML 的根元素?

VS2015-项目的默认XML名称空间必须是MSBuild XML名称空间

如何在不同的运行空间中运行函数,PowerShell

如何使用 XSLT 为所有元素和属性添加名称空间和前缀?

如何使用 XSLT 从 XML 中删除名称空间