Войти

Показать полную графическую версию : [решено] синхронизация двух .xml файлов


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

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

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

deviance
09-01-2014, 14:15
Предлагаю использовать grep (http://gnuwin32.sourceforge.net/packages/grep.htm). Действуем следующим образом:

1. Получаем имена узлов, которые переведены на русский язык.
grep -o --regexp="<string name=\".*\">" strings_ru.xml > ru_have.txt2. Выбрасываем их из файла strings.xml.
grep --invert-match -f ru_have.txt strings.xml > en_uniq.txt
Файл en_uniq.txt будет содержать недостающие значения.

DEDI
09-01-2014, 15:33
deviance, спасибо) хороший вариант, но форматирование .xml разрушается. Языковой пакет портится. Еще варианты есть?

deviance
09-01-2014, 15:59
DEDI, используйте опцию --binary
grep --binary --invert-match -f ru_have.txt strings.xml > en_uniq.txt

DEDI
09-01-2014, 22:15
deviance, нет, все равно, файл или данные повреждены. Есть еще варианты?

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

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

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

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

DEDI
09-01-2014, 23:35
deviance, нет, все равно ошибки есть. проверяется так, откройте оригинальный strings.xm в Internet Explorer и вы увидите код <?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, вы увидите 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
10-01-2014, 19:58
В таком случае будем использовать инструмент, предназначенный непосредственно для работы с xml - xmlstarlet (http://sourceforge.net/projects/xmlstar/files/).
Вот скрипт.

@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
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
Iska, огромное спасибо)просто шикарно)

Iska
11-01-2014, 20:10
DEDI, пытаемся учиться помаленьку ;).




© OSzone.net 2001-2012