Este es mi XML. Quiero agregar el espacio de nombres ns33: a cada etiqueta en mi xml. Quiero lograr esto usando PowerShell Script.

    <Information>
    <Name>Laksh</Name>
    <Age>23</Age>
    <Role>Dev</Role>
    </Information>

Este es mi guión:

        $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"

Pero la salida que espero es:

    <ns33:Information>
    <ns33:name>Laksh</ns33:name>
    <ns33:Age>23</ns33:Age>
    <ns33:Role>Dev</ns33:Role>
    </ns33:Information>

Por favor ayúdame a descifrar esto.

1
Lakshmana Perumal 21 feb. 2018 a las 10:29

2 respuestas

La mejor respuesta

Reemplazar no reemplaza en la cadena original. Sin embargo, el valor de retorno de .Replace contiene el resultado. En su código, asigna el resultado de reemplazar a $Display pero en lugar de ejecutar el segundo reemplazo en el resultado (es decir, Display), está reemplazando nuevamente en la cadena original. La cadena original no contiene <ns33:/, por lo que no se reemplaza nada.

Puede solucionar su problema utilizando el siguiente código.

[xml]$XmlData=Get-Content $Path

$Display=$XmlData.Innerxml.Replace("<","<ns33:").Replace("<ns33:/","</ns33:")

$Display > "C:\Users\Laksh\result.xml"
-1
rufer7 21 feb. 2018 a las 07:43
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

Entrada:

<Information>
    <Name>Laksh</Name>
    <Age>23</Age>
    <Role>Dev</Role>
</Information>

Salida:

<ns33:Information xmlns:ns33="ns33">
  <ns33:Name>Laksh</ns33:Name>
  <ns33:Age>23</ns33:Age>
  <ns33:Role>Dev</ns33:Role>
</ns33:Information>
1
fdafadf 21 feb. 2018 a las 12:56