Показать полную графическую версию : [решено] синхронизация двух .xml файлов
Есть два .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 будет содержать недостающие значения.
deviance, спасибо) хороший вариант, но форматирование .xml разрушается. Языковой пакет портится. Еще варианты есть?
deviance
09-01-2014, 15:59
DEDI, используйте опцию --binary
grep --binary --invert-match -f ru_have.txt strings.xml > en_uniq.txt
deviance, нет, все равно, файл или данные повреждены. Есть еще варианты?
deviance
09-01-2014, 23:25
файл или данные повреждены »
Что, всё-таки, повреждено: файл или данные? Если это текст сообщения об ошибке - то так и пишите.
Дело может быть в том, что я привёл Вам ошибочный скрипт. Правильный должен быть таким:
grep -o --regexp="<string name=\"[a-zA-Z_]*\"" strings_ru.xml > ru_have.txt
Второй скрипт правильный.
На всякий случай прикреплю свой результат.
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%
Он оставит в файле на английском языке только те узлы, которые не переведены.
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."
}
Iska, огромное спасибо)просто шикарно)
DEDI, пытаемся учиться помаленьку ;).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.