2013-11-20 12 views
6

Ho bisogno di modificare un file .xml con powershell. La cosa che devo fare è scaricare il file .xml dal server, aggiornare il numero di versione e salvarlo sul mio computer locale. Questo è quello che ho fatto.Modifica file .XML con PowerShell, codifica

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

Quindi avrò un nuovo file xml nel mio computer locale. Tuttavia, dubito che la codifica sia diversa poiché non posso elaborare con questo file .xml. Il .xml dovrei ottenere è qualcosa di simile:

<?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> 

Tuttavia, dopo la modifica con PowerShell, l'XML contiene alcune informazioni nascoste. Ho provato ad aprire con NotePad ++, ho qualcosa di simile:

<?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> 

Qualcuno può dirmi perché è la situazione? Grazie mille.

risposta

0

"ï" ¿"è il Byte Order Mark per UTF-8. C'è una soluzione per la scrittura di un file UTF-8 senza BOM qui: Using PowerShell to write a file in UTF-8 without the BOM

+0

Grazie. Questo funziona. Devo solo aggiungere una riga di codici. Grazie. – Payson

+2

Potrebbe estendere la risposta per mostrare come incorporare la soluzione collegata con un file XML? '[System.IO.File] :: WriteAllLines ($ MyPath, $ myXML, $ Utf8NoBomEncoding)' stampa semplicemente "System.Xml.XmlDocument". Preferirei non doverlo scrivere una volta con $ myXML.Save(), quindi rileggerlo di nuovo per salvare senza il BOM. – DannyMeister

6

Questo funziona per me, basato sul link qui sopra e sul 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() 

L'impostazione 'rientrato' è gusto personale ; Preferisco il mio XML leggibile. È richiesto anche $ wrt.Close().

+0

NB: questo funziona per me; ma per far sì che gli editor di testo riconoscano che il file è 'UTF-8' e non' ANSI' ho dovuto usare '$ true' per il parametro' encoderShouldEmitUTF8Identifier' sul costruttore 'UTF8Encoding'. – JohnLBevan

1

Invece di leggere l'XML utilizzando Get-Content, leggere il codice XML utilizzando direttamente il XmlDocument:

test di funzionamento ($ path) {

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

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

}

+0

'$ xDoc.Load ($ file)' non funziona se il file XML non contiene già una BOM - in realtà genera un'eccezione lamentandosi della BOM mancante. –

Problemi correlati