Есть ли способ запретить PowerShell изменять самозакрывающиеся теги при изменении документа XML? - PullRequest
0 голосов
/ 08 мая 2020

Итак, я пишу сценарий PowerShell, который проверяет файлы XML в папке на предмет наличия узла. Если его нет, он добавит узел с пустой строкой. Вот как выглядит мой сценарий PowerShell.

$files = Get-ChildItem "L:\Notes" -Filter *.xml -Recurse | % { $_.FullName }

#add tag confirmation message
$msg = 'Do you want to add to XML file? [Y/N]'

foreach ($file in $files) {
    write-host "searching " -NoNewline
    write-host ($file)
    write-host "`n`r"

    [xml]$xml = Get-Content $file

    $NodeCheck = $xml.note.from

    if ($NodeCheck) {
        write-host "from tag was found at" 
        write-host ($file)
        write-host ($NodeCheck.Value)
        write-host "`n`r"
        [void][System.Console]::ReadKey($true)
    } else {
            do {
                $response = Read-Host -Prompt $msg
                if ($response -eq 'y') {
                #test method
                $xml.note.from
                } elseif($response -eq 'n') {
                    write-host "Nothing changed"
                    write-host "`n`r"
                } else{
                    write-host "invalid response"
                    write-host "`n`r"
                }
            } until ($response -eq 'n'-or $response -eq 'y')
    $xml.Save($file)
    }

}

, поэтому в качестве примера он будет читать примечание. xml как

<note>
     <to>Tove</to>
     <heading>Reminder</heading>
     <body>Don't forget me this weekend!</body>
     <color/>
</note>

и, надеюсь, измените его на

<note>
    <to>Tove</to>
    <from></from>
     <heading>Reminder</heading>
     <body>Don't forget me this weekend!</body>
     <color/>
</note>

Однако, помимо кода, не добавляющего отсутствующий тег, он добавляет закрывающие теги вместо сохранения самозакрывающегося тега, поэтому XML выглядит так:

<note>
     <to>Tove</to>
     <from></from>
     <heading>Reminder</heading>
     <body>Don't forget me this weekend!</body>
     <color></color>
</note>

Как я могу запретить PowerShell изменять самозакрывающийся тег?

1 Ответ

0 голосов
/ 08 мая 2020

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

$xml = [System.Xml.XmlDocument](Get-Content .\Desktop\test.xml -Raw)
if (!$xml.SelectNodes("note/*").name.Contains("from")) {
    $from = $xml.CreateNode("element","from","")
    $to = $xml.SelectSingleNode("note/to")
    $xml.note.InsertAfter($from,$to)
}
$xml.Save(".\Desktop\test.xml")
$xml.OuterXml

Output

<note><to>Tove</to><from /><heading>Reminder</heading><body>Don't forget me this weekend!</body><color /></note>
...