Edit .XML file with Powershell, encoding

13,129

Solution 1

"" is the Byte Order Mark for UTF-8. There is a solution for writing a UTF-8 file without the BOM here: Using PowerShell to write a file in UTF-8 without the BOM

Solution 2

This works for me, based on the link above and on this blog post

$enc = New-Object System.Text.UTF8Encoding( $false )
$wrt = New-Object System.XML.XMLTextWriter( 'c:\path\out.xml', $enc )
$wrt.Formatting = 'Indented'
$myXML.Save( $wrt )
$wrt.Close()

The 'Indented' setting is personal taste; I prefer my XML human readable. The $wrt.Close() is also required.

Solution 3

Instead of reading the xml using get-content, read the xml using the XmlDocument directly:

function test($path) {

$xDoc = New-Object System.Xml.XmlDocument
$file = Resolve-Path($path)

$xDoc.Load($file)
$xDoc.Save($file) #will save correctly

}

Share:
13,129

Related videos on Youtube

Payson
Author by

Payson

Updated on September 14, 2022

Comments

  • Payson
    Payson over 1 year

    I need to edit a .xml file with powershell. The thing I need to do is to download the .xml file from the server, updated the version number, and then save it in my local computer. This is what I did.

    [xml]$myXML = get-content $xmlFileServer
    $myXML.'ivy-module'.info.revision = $newVersion
    $myXML.Save($newXMLFileName)
    

    Then I will have a new xml file in my local computer. However, I doubt the coding is different since I can't process with this .xml file. The .xml I should get is something like this:

    <?xml version="1.0" encoding="UTF-8"?>
    <ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd" xmlns:e="http://ant.apache.org/ivy/extra">
      <info organisation="XXXX" module="XXXX" revision="2.0.1.0" status="release" publication="20131119202217" />
      <publications>
        <artifact name="XXXX" type="dll" ext="zip" conf="*" />
      </publications>
    </ivy-module>
    

    However, after editing with powershell, the .xml contains some hidden info. I tried to open with NotePad++, I got something like this:

    <?xml version="1.0" encoding="UTF-8"?>
    <ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd" xmlns:e="http://ant.apache.org/ivy/extra">
      <info organisation="XXXX" module="XXXX" revision="2.0.1.0" status="release" publication="20131119202217"/>
      <publications>
        <artifact name="XXXX" type="dll" ext="zip" conf="*"/>
      </publications>
    </ivy-module>
    

    Can anyone tell me why is the situation? Thank you so much.

  • Payson
    Payson over 10 years
    Thanks. This works. I only need to add one line of codes. Thank you.
  • DannyMeister
    DannyMeister over 9 years
    Could you extend the answer to show how to incorporate the linked solution with an XML file? [System.IO.File]::WriteAllLines($MyPath, $myXML, $Utf8NoBomEncoding) simply prints out "System.Xml.XmlDocument". I would rather not have to write it once with $myXML.Save() then reread it in again to save without the BOM.
  • JohnLBevan
    JohnLBevan over 8 years
    NB: This works for me; but to have text editors recognise that the file is UTF-8 and not ANSI I had to use $true for the encoderShouldEmitUTF8Identifier parameter on UTF8Encoding's constructor.
  • Kenny Evitt
    Kenny Evitt almost 7 years
    $xDoc.Load($file) doesn't work if the XML file doesn't already contain a BOM – it actually throws an exception complaining about the missing BOM.
  • Soren Bjornstad
    Soren Bjornstad over 4 years
    This doesn't work for me in PowerShell 5.1. I get "Multiple ambiguous overloads found for 'Save' and the argument count '1'."
  • Soren Bjornstad
    Soren Bjornstad over 4 years
    Only thing that worked for me was using a StreamWriter: stackoverflow.com/a/30266424