Powershell удаляет узлы из XML и удаляет пустые строки при сохранении - PullRequest
0 голосов
/ 28 марта 2019

Через вызов Rest-API я получаю файл XML в Powershell.

#calling the REST service and get XML result
$xml = try {
    Invoke-RestMethod -Uri $url -ErrorAction Stop   
} catch {
    LogWrite "An exception was caught: $($formatstring -f $fields)";
    exit;
}

Затем я удаляю узлы, используя removeChild().

#manipulate XML
$xml.SelectNodes("//XPathQuery").ParentNode.RemoveChild(...)

Наконец я сохраняю обработанный XML.

#save XML
$xml.Save("$targetDirectory\$filename");

Полученный XML-файл содержит несколько пустых строк.

enter image description here

Я предполагаю, что каждая удаленная заметка привела к одной дополнительной пустой строке. Как этого можно избежать?

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Причина этой проблемы в том, что свойство PreserveWhitespace для XmlDocument имеет значение true.Вывод Invoke-RestMethod, по-видимому, устанавливает свойство PreserveWhitespace в значение по умолчанию.

Но установка $doc.PreserveWhitespace = $false на вывод Invoke-RestMethod не решает проблему, поскольку коды перевода строки остаются.

Я не могу найти возможность сброса PreserveWhitespace в Invoke-RestMethod, поэтому я думаю, что преобразование ответа в XmlDocument самостоятельно - самое простое решение.

$doc = New-Object System.Xml.XmlDocument
$doc.LoadXml((Invoke-WebRequest -Uri $url).Content)
0 голосов
/ 28 марта 2019

Я обычно использую базы данных xml для обработки небольших мультиатрибутивных баз данных, и при этой ошибке я использовал оператор linq и должен был использовать from, where и select, чтобы выбрать только те элементы, которые я хотел удалить.

var elementsToSelect = from ele in xmlDoc.Elements("List").Elements("Entry")
                       where ele != null && ele.Attribute("Name").Value.Equals(DropDownList1.SelectedValue)
                        select ele;

Мне нужно будет посмотреть запрос, чтобы увидеть, выбираете ли вы диапазон узлов на плате или просто один, как я делал выше, который решил мою ошибку. Я был на одном уровне, и он выбрал все узлы и удалил их.

...