2013-11-20 3 views
6

Мне нужно отредактировать XML-файл с помощью powershell. Мне нужно сделать, это загрузить XML-файл с сервера, обновить номер версии и сохранить его на локальном компьютере. Это то, что я сделал.Редактировать .XML-файл с помощью Powershell, кодировка

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

Тогда у меня будет новый xml-файл на моем локальном компьютере. Однако, я сомневаюсь, что кодирование отличается, поскольку я не могу обработать этот файл .xml. .xml в я должен получить что-то вроде этого:

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

Однако после редактирования с помощью PowerShell, то .xml содержит некоторую скрытую информацию. Я попытался открыть с помощью NotePad ++, у меня есть что-то вроде этого:

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

Может ли кто-нибудь сказать мне, почему это так? Большое вам спасибо.

ответ

0

"ï" ¿"является Byte Order Mark для UTF-8. Существует решение для записи файла UTF-8 без BOM здесь: Using PowerShell to write a file in UTF-8 without the BOM

+0

Спасибо. Это работает. Мне нужно только добавить одну строку кодов. Спасибо. – Payson

+2

Не могли бы вы расширить ответ, чтобы показать, как включить связанное решение с XML-файлом? '[System.IO.File] :: WriteAllLines ($ MyPath, $ myXML, $ Utf8NoBomEncoding)' просто выводит «System.Xml.XmlDocument». Я бы предпочел не писать один раз с помощью $ myXML.Save(), а затем перечитать его снова, чтобы сохранить без спецификации. – DannyMeister

6

Это работает для меня, основываясь на ссылку выше и на 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() 

значения «Углублен» является личным вкусом ; Я предпочитаю, чтобы мой XML был доступен для чтения. Требуется также $ wrt.Close().

+0

NB: Это работает для меня; но чтобы текстовые редакторы узнали, что файл является 'UTF-8', а не' ANSI', мне пришлось использовать '$ true' для параметра' encoderShouldEmitUTF8Identifier' в конструкторе 'UTF8Encoding'. – JohnLBevan

1

Вместо чтения XML с помощью Get-Content, читать XML с помощью XmlDocument непосредственно:

функция тест ($ путь) {

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

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

}

+0

'$ xDoc.Load ($ file)' не работает, если XML-файл еще не содержит спецификацию - он фактически выдает исключение, жалующееся на недостающую спецификацию. –

Смежные вопросы