Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] синхронизация двух .xml файлов (http://forum.oszone.net/showthread.php?t=275435)

DEDI 09-01-2014 02:40 2285197

синхронизация двух .xml файлов
 
Вложений: 1
Есть два .xml, языковые пакеты, strings.xml - в нем больше значений (переменных) и он на английском, strings_ru.xml - он на русском, но значений (переменных) у него меньше чем у английского файла.

Задача: нужно в файл strings_ru.xml (русский языковой пакет) перенести недостающие значение (переменные), которые есть в английском файле. Другими словами синхронизировать их. Но так что-бы, то что было на русском языке, так и осталось.

Заранее спасибо :)

deviance 09-01-2014 14:15 2285448

Предлагаю использовать grep. Действуем следующим образом:

1. Получаем имена узлов, которые переведены на русский язык.
Код:

grep -o --regexp="<string name=\".*\">" strings_ru.xml > ru_have.txt
2. Выбрасываем их из файла strings.xml.
Код:

grep --invert-match -f ru_have.txt strings.xml > en_uniq.txt
Файл en_uniq.txt будет содержать недостающие значения.

DEDI 09-01-2014 15:33 2285491

deviance, спасибо) хороший вариант, но форматирование .xml разрушается. Языковой пакет портится. Еще варианты есть?

deviance 09-01-2014 15:59 2285507

DEDI, используйте опцию --binary
Код:

grep --binary --invert-match -f ru_have.txt strings.xml > en_uniq.txt

DEDI 09-01-2014 22:15 2285701

deviance, нет, все равно, файл или данные повреждены. Есть еще варианты?

deviance 09-01-2014 23:25 2285731

Вложений: 1
Цитата:

Цитата DEDI
файл или данные повреждены »

Что, всё-таки, повреждено: файл или данные? Если это текст сообщения об ошибке - то так и пишите.

Дело может быть в том, что я привёл Вам ошибочный скрипт. Правильный должен быть таким:
Код:

grep -o --regexp="<string name=\"[a-zA-Z_]*\"" strings_ru.xml > ru_have.txt
Второй скрипт правильный.

На всякий случай прикреплю свой результат.

DEDI 09-01-2014 23:35 2285737

deviance, нет, все равно ошибки есть. проверяется так, откройте оригинальный strings.xm в Internet Explorer и вы увидите код
HTML код:

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

-<resources>

<string name="menu_delete">Удалить APN</string>

<string name="unknown">Неизвестно</string>

<string name="superuser">Суперпользователь</string>

<string name="allow">Разрешить</string>

а после обработки, при открытии Internet Explorer, вы увидите
PHP код:

All downloaded extras deleted MoKee Updater Displays available updates Full updates Get all versions (including old ones on the serverGet new versions only OTA updates Get OTA updates Apply update "You are about to upgrade to %s. If you press Update, the device will restart itself in recovery mode to install the update. Note: This feature requires a compatible Recovery or updates will need to be installed manually." Install extra &#24744;确定要安装扩展组件 %s 吗? Unable to reboot into recovery You have enabled experimental settings! No need, you have already enabled experimental settings. android.permission.ACCESS_SUPERUSER not declared in manifest." 

, значит где-то обрыв =(

deviance 10-01-2014 19:58 2286279

В таком случае будем использовать инструмент, предназначенный непосредственно для работы с xml - xmlstarlet.
Вот скрипт.
Код:

@echo off

set ru_xml=strings_ru.xml
set en_xml=strings.xml
set temp=tmp

xml sel -t -v "/resources/*/@name" %ru_xml% > ru_nodes

for /F %%i in (ru_nodes) do (
    echo deleting node '%%i'
    xml ed -d "/resources/string[@name='%%i']" %en_xml% > %temp%
    move %temp% %en_xml%
)
del /Q /F %temp%

Он оставит в файле на английском языке только те узлы, которые не переведены.

Iska 11-01-2014 07:21 2286551

PowerShell:
читать дальше »
Код:

$sSourceFile = "E:\Песочница\0346\strings\strings.xml"
$sDestFile  = "E:\Песочница\0346\strings\strings_ru.xml"

if(Test-Path -Path $sSourceFile) {
    if(Test-Path -Path $sDestFile) {
        $oSourceXmlDocument = New-Object -TypeName System.Xml.XmlDocument
        $oDestXmlDocument  = New-Object -TypeName System.Xml.XmlDocument
       
        $oSourceXmlDocument.load($sSourceFile)
        $oDestXmlDocument.load($sDestFile)

        $oXmlCollection = $oDestXmlDocument.resources
       
        $i = 0
        $iTotalStrings = $oSourceXmlDocument.resources.string.count
       
        foreach($elem in $oSourceXmlDocument.resources.string) {
            $i += 1
           
            if($oDestXmlDocument.SelectSingleNode("/resources/string[@name='$($elem.name)']") -eq $null) {
                $oXmlCollection.AppendChild($oDestXmlDocument.ImportNode($elem, $true)) | Out-Null
            }
           
            Write-Progress -Activity "Compare…" -Status "$i/$iTotalStrings" -PercentComplete ($i / $iTotalStrings * 100) -CurrentOperation "$($elem.name)"
        }

        $oDestXmlDocument.save($sDestFile)
    } else {
        Write-Error -Message "Destination xml file [$sDestFile] not found."
    }
} else {
    Write-Error -Message "Source xml file [$sSourceFile] not found."
}


DEDI 11-01-2014 19:38 2286943

Iska, огромное спасибо)просто шикарно)

Iska 11-01-2014 20:10 2286968

DEDI, пытаемся учиться помаленьку ;).


Время: 06:13.

Время: 06:13.
© OSzone.net 2001-