Как исправить пустую строку, которая добавляется на узел, которую я не трогал при изменении данных на узле XML? - PullRequest
0 голосов
/ 14 июня 2019

Моя цель сценария - изменить сервер в файле accounts.xml для Pidgin.Когда я запускаю свой код, все наверху, но один из узлов в XML теперь добавил новую строку, вызывая сбой учетной записи, поскольку он редактирует один узел, который не должен редактироваться.

У меня естьпопытался создать - найти шаблон, заменить строку новой строкой, не повезло.

Структура XML:

<?xml version='1.0' encoding='UTF-8' ?>

<account version='1.0'>
    <account>
        <protocol>prpl-jabber</protocol>
        <name>name1@old-domain/</name>
        <password>123qweASD</password>
        <statuses>
            <status type='available' name='Available' active='true'>
                <attributes/>
            </status>
            <status type='mood' name='Feeling' active='false'>
                <attributes/>
            </status>
            <status type='freeforchat' name='Chatty' active='false'>
                <attributes/>
            </status>
            <status type='away' name='Away' active='false'>
                <attributes/>
            </status>
            <status type='extended_away' name='Extended away' active='false'>
                <attributes/>
            </status>
            <status type='dnd' name='Do Not Disturb' active='false'>
                <attributes/>
            </status>
            <status type='offline' name='Offline' active='false'>
                <attributes/>
            </status>
        </statuses>
        <userinfo></userinfo>
        <settings>
            <setting name='bosh_url' type='string'></setting>
            <setting name='buddy_icon_timestamp' type='int'>0</setting>
            <setting name='auth_plain_in_clear' type='bool'>0</setting>
            <setting name='custom_smileys' type='bool'>1</setting>
            <setting name='port' type='int'>5222</setting>
            <setting name='connect_server' type='string'></setting>
            <setting name='check-mail' type='bool'>0</setting>
            <setting name='buddy_icon'/>
            <setting name='ft_proxies' type='string'></setting>
            <setting name='connection_security' type='string'>opportunistic_tls</setting>
            <setting name='use-global-buddyicon' type='bool'>1</setting>
        </settings>
        <settings ui='gtk-gaim'>
            <setting name='auto-login' type='bool'>0</setting>
        </settings>
        <current_error/>
    </account>
    <account>
        <protocol>prpl-jabber</protocol>
        <name>name2@old-domain/</name>
        <password>123qweASD</password>
        <statuses>
            <status type='available' name='Available' active='true'>
                <attributes/>
            </status>
            <status type='mood' name='Feeling' active='false'>
                <attributes/>
            </status>
            <status type='freeforchat' name='Chatty' active='false'>
                <attributes/>
            </status>
            <status type='away' name='Away' active='false'>
                <attributes/>
            </status>
            <status type='extended_away' name='Extended away' active='false'>
                <attributes/>
            </status>
            <status type='dnd' name='Do Not Disturb' active='false'>
                <attributes/>
            </status>
            <status type='offline' name='Offline' active='false'>
                <attributes/>
            </status>
        </statuses>
        <userinfo></userinfo>
        <settings>
            <setting name='bosh_url' type='string'></setting>
            <setting name='buddy_icon_timestamp' type='int'>0</setting>
            <setting name='auth_plain_in_clear' type='bool'>0</setting>
            <setting name='custom_smileys' type='bool'>1</setting>
            <setting name='port' type='int'>5222</setting>
            <setting name='connect_server' type='string'></setting>
            <setting name='check-mail' type='bool'>0</setting>
            <setting name='buddy_icon'/>
            <setting name='ft_proxies' type='string'></setting>
            <setting name='connection_security' type='string'>opportunistic_tls</setting>
            <setting name='use-global-buddyicon' type='bool'>1</setting>
        </settings>
        <settings ui='gtk-gaim'>
            <setting name='auto-login' type='bool'>0</setting>
        </settings>
        <current_error/>
    </account>
</account>

$path="$Env:USERPROFILE\AppData\Roaming\.purple\"
$file="$path\accounts.xml"
$myxml = [xml](gc -Encoding utf8 $path\accounts.xml) 

$myxml.SelectNodes('//account/account/name') | foreach {
    $account = $_.'#text'.split('@')[0] 
    $server = $_.'#text'.split('@')[1]  
    Write-Host "$account   @   $server"
    $_.'#text'= $account+'@'+$server -Replace "old.domain/","new-domain/"

 }

$myxml.Save($file)
Stop-Process -processname pidgin -Force
Start-Sleep -s 1
Start-Process -FilePath "C:\Program Files (x86)\Pidgin\pidgin.exe"
Start-Process -FilePath "$Env:USERPROFILE\AppData\Roaming\Microsoft\Windows\Pidgin\pidgin.exe"
Write-Host "OK"

При запуске данные в учетной записи \ учетной записи \ имени изменяются, для всех записей.Но теперь для каждой записи в настройках, для bosch url, Powershell создает «семь« пробелов »» и новую строку, вызывающую строку, которая должна выглядеть следующим образом:

<setting name='bosh_url' type='string'></setting>

выглядит как:

<setting name='bosh_url' type='string'>
      </setting>

Но в коде я даже не касаюсь настройки узлов.

Спасибо

1 Ответ

0 голосов
/ 14 июня 2019

Попробуйте:

$xml = New-Object System.Xml.XmlDocument
$xml.PreserveWhitespace = $true
$xml.Load($file)
   ...do something
$xml.Save($file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...