Edit .XML file with Powershell, encoding
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
}
Related videos on Youtube
Payson
Updated on September 14, 2022Comments
-
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 over 10 yearsThanks. This works. I only need to add one line of codes. Thank you.
-
DannyMeister over 9 yearsCould 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 over 8 yearsNB: This works for me; but to have text editors recognise that the file is
UTF-8
and notANSI
I had to use$true
for theencoderShouldEmitUTF8Identifier
parameter onUTF8Encoding
's constructor. -
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 over 4 yearsThis doesn't work for me in PowerShell 5.1. I get "Multiple ambiguous overloads found for 'Save' and the argument count '1'."
-
Soren Bjornstad over 4 yearsOnly thing that worked for me was using a StreamWriter: stackoverflow.com/a/30266424