这是我的Xml.I想要将命名空间ns33:添加到我的xml中的每个标记。我想使用powershell脚本实现这一点。
<Information>
<Name>Laksh</Name>
<Age>23</Age>
<Role>Dev</Role>
</Information>
这是我的剧本:
$Path="C:\Users\Laksh\Random.xml"
[xml]$XmlData=Get-Content $Path
$Display=$XmlData.Innerxml.Replace("<","<ns33:")
$Display=$XmlData.Innerxml.Replace("<ns33:/","</ns33:")
$Display > "C:\Users\Laksh\result.xml"
但我期望的输出是:
<ns33:Information>
<ns33:name>Laksh</ns33:name>
<ns33:Age>23</ns33:Age>
<ns33:Role>Dev</ns33:Role>
</ns33:Information>
请帮我解决这个问题。
答案 0 :(得分:1)
function Convert-ToXmlWithPrefixes
{
param
(
[Parameter(Mandatory=$true)]
$InputPath,
[Parameter(Mandatory=$true)]
$OutputPath,
[Parameter(Mandatory=$true)]
$Prefix,
[Switch]
$OmitXmlDeclaration
)
process
{
[Reflection.Assembly]::LoadWithPartialName('System.Xml.Linq') | Out-Null
$ns33 = [Xml.Linq.XNamespace]$Prefix
$document = [Xml.Linq.XDocument]::Load($InputPath)
$document.Root.Add((New-Object Xml.Linq.XAttribute(([Xml.Linq.XName]([Xml.Linq.XNamespace]::Xmlns + $Prefix)), $Prefix)))
foreach ($node in $document.Descendants())
{
$node.Name = $ns33.GetName($node.Name.LocalName)
}
try
{
$writerSettings = New-Object Xml.XmlWriterSettings
$writerSettings.OmitXmlDeclaration = $OmitXmlDeclaration
$writerSettings.Indent = $true
$writer = [Xml.XmlWriter]::Create($OutputPath, $writerSettings)
$document.Save($writer)
}
finally
{
$writer.Dispose()
}
}
}
Convert-ToXmlWithPrefixes -InputPath 'C:\Deployment\test.xml' -OutputPath 'C:\Deployment\test_out.xml' -Prefix 'ns33' -OmitXmlDeclaration
输入:
<Information>
<Name>Laksh</Name>
<Age>23</Age>
<Role>Dev</Role>
</Information>
输出:
<ns33:Information xmlns:ns33="ns33">
<ns33:Name>Laksh</ns33:Name>
<ns33:Age>23</ns33:Age>
<ns33:Role>Dev</ns33:Role>
</ns33:Information>
答案 1 :(得分:-1)
替换不会替换原始字符串。但是.Replace
的返回值包含结果。在您的代码中,您将替换结果分配给$Display
,但不是在结果上执行第二次替换(即Display
),而是再次替换原始字符串。原始字符串不包含<ns33:/
,因此不会替换任何内容。
您可以使用以下代码解决问题。
[xml]$XmlData=Get-Content $Path
$Display=$XmlData.Innerxml.Replace("<","<ns33:").Replace("<ns33:/","</ns33:")
$Display > "C:\Users\Laksh\result.xml"