Разбор XML и переименование специального символа в имени файла (как XML, так и местоположение) - PullRequest
0 голосов
/ 31 января 2019

Я нахожусь в ситуации копирования файлов из Unix в Windows.Файлы в Unix имеют специальные символы, которые Windows не принимает.

У меня есть файл XML с тегами для каждого из файлов в местоположении.Этот файл XML будет передан в одно из приложений для обработки.

  1. Выберите один файл XML.
  2. Просмотрите атрибуты и найдите <file>.
  3. Проверьте, имеет ли значение атрибута специальный символ.
  4. Перейдите к следующему файлу, если нет специального символа.Если значение имеет специальный символ - перейдите в местоположение и переименуйте специальный символ с допустимыми (например, переименуйте / с -).
  5. Сделайте то же самое переименование в теге файла XML.
  6. Перейдите к следующему тегу файла и выберите следующий XML-контент.

Я думал сделать это в PowerShell.

Пример XML:

<import>
    <node type="document" action="create">
        <location>XXXXXX</location>
        <title>log_0.log</title>
        <created>20190117</created>
        <file>\test*\log/0/.log</file>
    </node>

В приведенном выше примере <File> есть два специальных символа ... Один находится в имени папки (*), а другой - в имени файла (//).

1 Ответ

0 голосов
/ 31 января 2019

Чтобы решить проблему, адаптируйте для себя следующий фрагмент.

$x=[xml]@'
<import>
  <node type="document" action="create">
    <location>XXXXXX</location>
    <title>log_0.log</title>
      <created>20190117</created>
      <file>\test*\log/0/.log</file>
  </node>
</import>
'@
$x.SelectNodes('/import/node/file') |
  ForEach-Object {
    $file = $_.'#text'
    [char[]]$file |
      ForEach-Object {
        if( [System.IO.Path]::GetInvalidPathChars() -contains $_ ) {
          $file = $file.Replace($_, '_')
        }
        if( $_ -ne [System.IO.Path]::DirectorySeparatorChar -and
            [System.IO.Path]::GetInvalidFileNameChars() -contains $_ ) {
          $file = $file.Replace($_, '_')
        }
      }
    $file
  }

Вывод:

\test_\log_0_.log
...