Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] синхронизация двух .xml файлов

Ответить
Настройки темы
Разное - [решено] синхронизация двух .xml файлов

Аватара для DEDI

Новый участник


Сообщения: 44
Благодарности: 5


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: DEDI
Дата: 09-01-2014
Вложения
Тип файла: zip strings.zip
(95.3 Kb, 31 просмотров)
Есть два .xml, языковые пакеты, strings.xml - в нем больше значений (переменных) и он на английском, strings_ru.xml - он на русском, но значений (переменных) у него меньше чем у английского файла.

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

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

Отправлено: 02:40, 09-01-2014

 

Аватара для deviance

Пользователь


Сообщения: 123
Благодарности: 43

Профиль | Отправить PM | Цитировать


Предлагаю использовать 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 будет содержать недостающие значения.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:15, 09-01-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для DEDI

Новый участник


Сообщения: 44
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:33, 09-01-2014 | #3


Аватара для deviance

Пользователь


Сообщения: 123
Благодарности: 43

Профиль | Отправить PM | Цитировать


DEDI, используйте опцию --binary
Код: Выделить весь код
grep --binary --invert-match -f ru_have.txt strings.xml > en_uniq.txt
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:59, 09-01-2014 | #4


Аватара для DEDI

Новый участник


Сообщения: 44
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:15, 09-01-2014 | #5


Аватара для deviance

Пользователь


Сообщения: 123
Благодарности: 43

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip strings_ru_en.xml.zip
(57.6 Kb, 16 просмотров)

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

Дело может быть в том, что я привёл Вам ошибочный скрипт. Правильный должен быть таким:
Код: Выделить весь код
grep -o --regexp="<string name=\"[a-zA-Z_]*\"" strings_ru.xml > ru_have.txt
Второй скрипт правильный.

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

Отправлено: 23:25, 09-01-2014 | #6


Аватара для DEDI

Новый участник


Сообщения: 44
Благодарности: 5

Профиль | Отправить PM | Цитировать


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." 


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

Отправлено: 23:35, 09-01-2014 | #7


Аватара для deviance

Пользователь


Сообщения: 123
Благодарности: 43

Профиль | Отправить PM | Цитировать


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

Отправлено: 19:58, 10-01-2014 | #8


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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."
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:21, 11-01-2014 | #9


Аватара для DEDI

Новый участник


Сообщения: 44
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 19:38, 11-01-2014 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] синхронизация двух .xml файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Прочее - Синхронизация одной папки на двух компьютерах CrOsP Сетевые технологии 3 19-08-2013 08:37
Разное - [решено] Синхронизация данных на двух носителях robix Microsoft Windows 2000/XP 2 15-04-2012 23:53
Интернет - [решено] Синхронизация двух сетевых карт. Starky Microsoft Windows 7 7 01-11-2009 17:45
Почта - синхронизация двух почтовых клиентов Gmail emergency Программное обеспечение Windows 0 11-12-2008 16:32
синхронизация файлов kwinto Microsoft Windows NT/2000/2003 2 23-08-2006 22:51




 
Переход