PowerShell - заменить третье и четвертое вхождение строки - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть файл xml, который я хотел бы заменить третьим и четвертым вхождением строки. Я перепробовал много вещей, но не могу заставить его работать (или даже близко, поэтому я не думаю, что здесь есть смысл делиться) Ниже у меня есть образец XML с аналогичной структурой. Я хотел бы заменить третье и четвертое вхождение книги, чтобы оно стало другим (например, книга2).

<?xml version="1.0"?>
<catalog>
   <book>
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book>
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
</catalog>

Я хотел бы заменить третье и четвертое вхождения "book", чтобы оно отличалось от "book2".

Я хотел бы, чтобы файл имел следующее, когда код запускается.

<?xml version="1.0"?>
<catalog>
   <book>
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book2>
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book2>
</catalog>

Затем я выполню следующий код.

$filePathToTask = "C:\Users\Dan\Desktop\Books.xml"
$xml = New-Object XML
$xml.Load($filePathToTask)
$element =  $xml.SelectSingleNode("/catalog/book2/genre")
$element.InnerText = "Fiction"
$xml.Save($filePathToTask)

И, наконец, я верну код обратно в «Книгу»

Окончательный вывод будет выглядеть следующим образом.

<?xml version="1.0"?>
<catalog>
   <book>
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book>
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fiction</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
</catalog>

Я очень новичок в PowerShell, поэтому я ценю любую помощь.

Даниэль

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

при условии, что есть только два <book></book> блока, похоже, это делает то, что вы хотите ... [ ухмылка ] я все еще не могу обернуть голову, ПОЧЕМУ это, но это не важно ,

что делает код ...

  • фальсифицирует чтение в файле как массив строк текста
    когда вы готовы использовать реальные данные, закомментируйте все #region/#endregion заблокируйте и замените его вызовом Get-Content.
  • устанавливает целевые и замещающие строки
  • устанавливает "найденное целевое" число равным нулю
  • перебирает массив строк
  • считает целевые строки
  • как только $TCount превышает 2, он заменяет цель строкой замены
  • отправляет текущий $Line в коллекцию $UpdatedInStuff
  • отображает это на экране

вот код ...

#region >>> fake reading in a file
#    in real life, use Get-Content
$InStuff = @'
<?xml version="1.0"?>
<catalog>
   <book>
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book>
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
</catalog>
'@ -split [System.Environment]::NewLine
#endregion >>> fake reading in a file

$Target = 'book>'
$TReplace = 'book2>'

$TCount = 0
$UpdatedInStuff = foreach ($Line in $InStuff)
    {
    if ($Line -match $Target)
        {
        $TCount ++
        }
    if ($TCount -gt 2)
        {
        $Line = $Line -replace $Target, $TReplace
        }

    $Line
    }

$UpdatedInStuff

вывод ...

<?xml version="1.0"?>
<catalog>
   <book>
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book2>
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book2>
</catalog>
0 голосов
/ 20 апреля 2020

Я думаю, вы хотите что-то вроде:

$filePathToTask = "C:\Users\Dan\Desktop\Books.xml"
$xml = New-Object XML
$xml.Load($filePathToTask)
$root = $xml.DocumentElement

$books = $root.SelectNodes("/catalog/book")

# Modify the 2nd book genre
$books[1].genre = "Fiction"

$xml.Save($filePathToTask)

Нет необходимости создавать промежуточный XML.

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