4

I have a rather large XML file that I need to replace some connection strings within.

I use the following code to replace the strings:

$temp = Get-Content .\bigxmlfile.xml
$temp.replace("STRING1","STRING2") | out-file .\bigxmlfile.xml -force

This changes the strings just fine but for some reason ALWAYS ends up breaking the XML. I'm having trouble figuring out why.

JustAGuy
  • 629
  • 3
  • 18
  • 35

3 Answers3

4

Out-File is writing a Unicode file by default. Use -Encoding to fix it:

$temp = Get-Content .\bigxmlfile.xml
$temp.replace("STRING1","STRING2") | out-file .\bigxmlfile.xml -force -encoding ascii

Alternatively, use Set-Content:

$temp = Get-Content .\bigxmlfile.xml
$temp.replace("STRING1","STRING2") | set-content .\bigxmlfile.xml -force
briantist
  • 2,535
  • 18
  • 34
1

If you process XML using non-XML-aware tools, you will always run this risk. If you want to do a transformation on XML, the best tool for the job is the XML transformation language, XSLT.

Michael Kay
  • 111
  • 2
  • I don't disagree, and powershell has an `[XML]` type, but in this case it's likely that the he or she would have the same problem no matter how the data was transformed (if I'm right about the issue being encoding). – briantist Oct 28 '14 at 13:59
  • 1
    Well, we don't know how it's breaking the XML. It could be making it invalid against an external DTD or schema, for example. Encoding was just a guess. But yes, I didn't read carefully enough to work out that it would be challenge to find a document where replacing str1 by str2 causes a well-formedness error. – Michael Kay Oct 28 '14 at 20:53
0

Have you tried using Import-CLIXML instead of Get-Content?
I don't know how well it handles big or complex xml files, but it's worth a shot.

EliadTech
  • 1,230
  • 9
  • 14