使用Powershell脚本将命名空间添加到XML中的每个标记

时间:2018-02-21 07:29:45

标签: xml powershell

这是我的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>

请帮我解决这个问题。

2 个答案:

答案 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"