Разное - [решено] синхронизация двух .xml файлов

Аватара пользователя
Iska

Разное - [решено] синхронизация двух .xml файлов

Сообщение Iska »

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



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



Заранее спасибо Изображение
Вложения
strings.zip
(95.27 КБ) 0 скачиваний
strings.zip
(95.27 КБ) 0 скачиваний
Аватара пользователя
deviance

Re: Разное - [решено] синхронизация двух .xml файлов

Сообщение deviance »

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

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

Код:

Код: Выделить всё

grep -o --regexp="" strings_ru.xml > ru_have.txt

2. Выбрасываем их из файла strings.xml.

Код:

Код: Выделить всё

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

Файл en_uniq.txt будет содержать недостающие значения.
Аватара пользователя
deviance

Re: Разное - [решено] синхронизация двух .xml файлов

Сообщение deviance »

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

Код:

Код: Выделить всё

grep --binary --invert-match -f ru_have.txt strings.xml > en_uniq.txt
Аватара пользователя
DEDI

Re: Разное - [решено] синхронизация двух .xml файлов

Сообщение DEDI »

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

Re: Разное - [решено] синхронизация двух .xml файлов

Сообщение DEDI »

Цитата DEDI:



файл или данные повреждены
Разное - [решено] синхронизация двух .xml файлов




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



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



Код:

Код: Выделить всё

grep -o --regexp="

Второй скрипт правильный.



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

Re: Разное - [решено] синхронизация двух .xml файлов

Сообщение deviance »

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

HTML код:

Код: Выделить всё

-
Удалить APN
Неизвестно
Суперпользователь
Разрешить



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

PHP код:

Код: Выделить всё

All downloaded extras deleted MoKee Updater Displays available updates Full updates Get all versions (including old ones on the server) Get 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 您确定要安装扩展组件 %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." 






, значит где-то обрыв =(
Вложения
strings_ru_en.xml.zip
(57.61 КБ) 0 скачиваний
strings_ru_en.xml.zip
(57.61 КБ) 0 скачиваний
Аватара пользователя
DEDI

Re: Разное - [решено] синхронизация двух .xml файлов

Сообщение DEDI »

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

HTML код:

Код: Выделить всё

-
Удалить APN
Неизвестно
Суперпользователь
Разрешить


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

PHP код:

Код: Выделить всё

All downloaded extras deleted MoKee Updater Displays available updates Full updates Get all versions (including old ones on the server) Get 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 您确定要安装扩展组件 %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

Re: Разное - [решено] синхронизация двух .xml файлов

Сообщение deviance »

В таком случае будем использовать инструмент, предназначенный непосредственно для работы с 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

Re: Разное - [решено] синхронизация двух .xml файлов

Сообщение Iska »

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."
}
Ответить

Вернуться в «Программирование и базы данных»