Я пытаюсь синхронизировать XML-узлы из одного файла в другой. Но иногда эти узлы содержат только простой пустой символ, и эти узлы выдают мне ошибку, когда я пытаюсь их синхронизировать
Существует программное обеспечение, которое генерирует шаблонный xlf-файл, который регулярно обновляется. И я хочу перенести эти обновления в локализованные xlf-файлы, которые уже были созданы.
Таким образом, если есть узлы «trans-unit», добавленные или удаленные из шаблона (в коде примера это называется «global»), скрипт работает нормально. (не входит в пример)
Однако есть дочерний элемент с именем «source», который иногда содержит только пробел, и я не могу получить powershell, чтобы обрабатывать это так же, как он обрабатывает все остальные строки.
Похоже, что элемент -eq $ null и в то же время нет. - Я предполагаю, что происходит неявное форматирование, но я слишком неопытен с PowerShell, и я даже не знаю, для чего я мог бы Google, чтобы решить проблему самостоятельно, так как я не знаю, если это проблема с тем, как PS обрабатывает XML или есть общее неявное поведение, которое я бессознательно использовал все время, и в этом случае оно не работает.
Я сократил все решение настолько, насколько смог, чтобы вам было как можно проще анализировать и тестировать его. без необходимости изменять определения пространства имен и т. д.
cls
$globalXmlSting = '<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en-US" target-language="en-US" original="base">
<body>
<group id="body">
<trans-unit id="Entry1" size-unit="char" translate="yes" xml:space="preserve">
<source>Last Date Modified</source>
</trans-unit>
<trans-unit id="Entry2" size-unit="char" translate="yes" xml:space="preserve">
<source> </source>
</trans-unit>
<trans-unit id="Entry3" size-unit="char" translate="yes" xml:space="preserve">
<source>something</source>
<target> </target>
</trans-unit>
</group>
</body>
</file>
</xliff>'
$locXmlString = '<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en-US" target-language="de-DE" original="base">
<body>
<group id="body">
<trans-unit id="Entry1" size-unit="char" translate="yes" xml:space="preserve">
<source>Date Modified</source>
<target>Aktualisiert am</target>
</trans-unit>
<trans-unit id="Entry2" size-unit="char" translate="yes" xml:space="preserve">
<source>something</source>
<target> </target>
</trans-unit>
<trans-unit id="Entry3" size-unit="char" translate="yes" xml:space="preserve">
<source> </source>
<target> </target>
</trans-unit>
</group>
</body>
</file>
</xliff>'
$globalXml = New-Object xml
$globalXml.LoadXml($globalXmlSting)
$locXml = New-Object xml
$locXml.LoadXml($locXmlString)
# NSMgr for Loc Xml
$locNs = New-Object System.Xml.XmlNamespaceManager($locXml.NameTable)
$locNs.AddNamespace("ns", $locXml.DocumentElement.NamespaceURI)
foreach ($gTransUnit in $globalXml.xliff.file.body.group.'trans-unit') {
$locTransUnit = $locXml.SelectSingleNode("//ns:trans-unit[@id='$($gTransUnit.id)']", $locNs)
# Add non existent trans-unit elements
if ($locTransUnit -ne $null) {
Write-Host "old:"
Write-Host $gTransUnit.source
Write-Host $locTransUnit.source
$locTransUnit.source = $gTransUnit.source
Write-Host "new:"
Write-Host $gTransUnit.source
Write-Host $locTransUnit.source
}
}
Entry1 ведет себя так, как я и ожидал - Скопируйте содержимое «source» в локальную версию. Entry2 и Entry 3 дают мне ошибку, которую я, честно говоря, не совсем понимаю:
(извините, по-немецки)
"source" kann nicht festgelegt werden, da nur Zeichenfolgen als Werte zum Festlegen von XmlNode-Eigenschaften verwendet werden können.
In Zeile:62 Zeichen:9
+ $locTransUnit.source = $gTransUnit.source
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], SetValueException
+ FullyQualifiedErrorId : XmlNodeSetRestrictionsUnknownNodeType
Ваша помощь очень ценится. - Я также открыт для объяснения, где я ошибся, поэтому я могу избежать этого в будущем