назначение «пустых» узлов xml (они существуют и имеют пробел в них) - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь синхронизировать 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

Ваша помощь очень ценится. - Я также открыт для объяснения, где я ошибся, поэтому я могу избежать этого в будущем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...